J'ai mis un container dans mon MainViewController. Puis ajouté FirstViewController à l'intérieur container

let containerView = UIView()
view.addSubview(containerView)

let controller = FirstViewController()
addChildViewController(controller)
containerView.addSubview(controller.view)

controller.didMove(toParentViewController: self)

Il y a un UITextField et un UIButton à l'intérieur de FirstViewController. Il y a une étiquette à l'intérieur de SecondViewController et var passedText = "" pour mettre à jour le texte UILabel. Je veux juste définir le texte UILabel en fonction du texte UITextField de FirstViewController lorsque j'appuie sur UIButton et cela devrait également conduire à SecondViewController. Il s'agit de la méthode d'action UIButton de FirstViewController. Je n'utilise pas Storyboard

@IBAction func btnPressed(_ sender: Any) {
   let secondVC = SecondViewController()
   addChildViewController(secondVC)
   view.addSubview(secondVC.view)

   secondVC.view.frame = view.bounds
   secondVC.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

   secondVC.didMove(toParentViewController: self)
   secondVC.passedText = inputTextField.text!
}

C'est FirstViewController

class FirstViewController: UIViewController {

  @IBOutlet weak var inputTextField: UITextField!

  let secondVC = SecondViewController()

  override func viewDidLoad() {
    super.viewDidLoad()
  }

  @IBAction func btnPressed(_ sender: Any) {
    addChildViewController(secondVC)
    view.addSubview(secondVC.view)

    secondVC.view.frame = view.bounds
    secondVC.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    secondVC.didMove(toParentViewController: self)
    secondVC.passedText = inputTextField.text!
  }        
}

C'est SecondViewController

class SecondViewController: UIViewController {

  var passedText = ""

  @IBOutlet weak var label: UILabel!

  override func viewDidLoad() {
    super.viewDidLoad()

    label.text = passedText
  }
}
0
ZephyrYK 23 mai 2018 à 14:31

3 réponses

Meilleure réponse

Fermeture

class ParentViewController: UIViewController {

    var embeddedViewController: UIViewController?

    override func viewDidLoad() {
        super.viewDidLoad()

        let firstViewController = FirstViewController()
        embedViewController(firstViewController)
        firstViewController.passDataClosure = { [weak self] text in
            let secondViewController = SecondViewController()
            self?.embedViewController(secondViewController)
            secondViewController.passedText = text
        }
    }

    func embedViewController(_ viewController: UIViewController) {
        removeEmbedded()
        viewController.view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        addChildViewController(viewController)
        view.addSubview(viewController.view)
        viewController.didMove(toParentViewController: self)
        embeddedViewController = viewController
    }

    func removeEmbedded() {
        embeddedViewController?.view.removeFromSuperview()
        embeddedViewController?.didMove(toParentViewController: nil)
        embeddedViewController?.removeFromParentViewController()
    }
}

-

class FirstViewController: UIViewController {

    var passDataClosure: ((String?) -> Void)?

    @IBOutlet weak var inputTextField: UITextField!

    @IBAction func btnPressed(_ sender: Any) {
        passDataClosure?(inputTextField.text)
    }
}

-

class SecondViewController: UIViewController {

    var passedText: String? {
        didSet {
            label.text = passedText
        }
    }

    @IBOutlet weak var label: UILabel!
}

Déléguer

class ParentViewController: UIViewController, FirstViewControllerDelegate {

    var embeddedViewController: UIViewController?

    override func viewDidLoad() {
        super.viewDidLoad()

        let firstViewController = FirstViewController()
        embedViewController(firstViewController)
        firstViewController.delegate = self
    }

    func embedViewController(_ viewController: UIViewController) {
        removeEmbedded()
        viewController.view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        addChildViewController(viewController)
        view.addSubview(viewController.view)
        viewController.didMove(toParentViewController: self)
        embeddedViewController = viewController
    }

    func removeEmbedded() {
        embeddedViewController?.view.removeFromSuperview()
        embeddedViewController?.didMove(toParentViewController: nil)
        embeddedViewController?.removeFromParentViewController()
    }

    // MARK: FirstViewControllerDelegate
    func firstViewController(_ firstViewController: FirstViewController, pass text: String?) {
        let secondViewController = SecondViewController()
        embedViewController(secondViewController)
        secondViewController.passedText = text
    }
}

-

class SecondViewController: UIViewController {

    var passedText: String? {
        didSet {
            label.text = passedText
        }
    }

    @IBOutlet weak var label: UILabel!
}

-

protocol FirstViewControllerDelegate: class {
    func firstViewController(_ firstViewController: FirstViewController, pass text: String?)
}

class FirstViewController: UIViewController {

    weak var delegate: FirstViewControllerDelegate?

    @IBOutlet weak var inputTextField: UITextField!

    @IBAction func btnPressed(_ sender: Any) {
        delegate?.firstViewController(self, pass: inputTextField.text)
    }
}
1
Alexey Kudlay 23 mai 2018 à 13:11

Pour autant que je puisse voir, cela devrait fonctionner:

secondVC.label.text = inputTextField.text

Vous avez actuellement secondVC.label = inputTextField.text qui ne devrait même pas être compilé.

0
andlin 23 mai 2018 à 11:38

Vous pouvez créer une classe singleton pour votre scénario. afin que vous puissiez accéder à toutes vos données importantes de n'importe où à partir de votre firstViewController ou SecondViewController.

class YourDataClass : NSObject{

var textFieldData = String()
var lblSeconddata = String()
 struct Static
    {
        public static var instance: YourDataClass?
    }

    class var singleton: YourDataClass
    {
        if Static.instance == nil
        {
            Static.instance = YourDataClass()
        }

        return Static.instance!
    }
}

Maintenant quelque part dans votre contrôleur

YourDataClass.Singleton.textFieldData = txtFld.Text
YourDataClass.Singleton. lblSeconddata = lblText.Text

De la même manière que vous pouvez l'obtenir n'importe où

-1
Abhay Singh 23 mai 2018 à 11:45