2017-01-27 7 views
1

別のVCに埋め込まれたビューコントローラがあります。 私は組み込みVC内のメインVCから変数の値を取得したいと思います。 どうすればいいですか?Swift埋め込みビューコントローラと親

私は "prepareForSegue"で試してみましたが、埋め込みビューコントローラではトリガされていないようです。

私はテストプロジェクトに問題を特定しようとした:メインVCのための

enter image description here

コード:

class MyViewController: UIViewController { 
    @IBOutlet weak var label1: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     label1.text = "Hello" 
    } 
} 

コード埋め込まれたVCのために:

class EmbeddedVC: UIViewController { 
    @IBOutlet weak var label2: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     //label2.text = how to get value of label1 ? 
    } 
} 

をありがとうあなたの助け:)

+1

これは組み込みシステムではありません。タグの説明を質問に追加する前に読んでください。 – Lundin

答えて

3

これを行う方法は、親のviewDidLoadで子ビューコントローラのインスタンスを取得することです。親のviewDidLoad:は、子のviewDidLoad:の後に呼び出されたように見えます。これは、ラベルが既に子ビューで作成されていることを意味します。

override func viewDidLoad() { 
     super.viewDidLoad() 

     if let childVC = self.childViewControllers.first as? ChildVC { 
      childVC.someLabel.text = "I'm here. Aye-aye." 
     } 

    } 
+0

クルーズの解決策もどちらかといえば問題ありませんが、この方がより緊迫しているようです。 – Eric

2

あなたはこのようprepareForSegueを使用するようにしてください:セグエ識別子あなたが直接設定することはできませんすべてのストーリーボード

4

まずに割り当てる

if segue.identifier == "identifier" { 
     guard let destinationViewController = segue.destination as? VC2 else { return } 

     destinationViewController.label2.text = mytext 
    } 

prepareForSegue

ためにEmbeddedVCのlable2.text以下のコールシーケンス

  1. MainVC's prepareForSeque今回は組み込みVCのラベル2 i sのゼロ
  2. EmbeddedVCのviewDidLoadその後呼ばlabel2にロードされた
  3. MainVCのviewDidLoadあなたはとてもうまくいきませんでしたされてnilをprepareForSeque 両方LABEL1とLABEL2にEmbeddedVC's label2.textMainVC's label1.textを割り当てた場合

ので、その後LABEL1ロードされたと呼ばれる

この質問を解決する方法は2つあります。

最初の解決策 MainViewControllerはEmbeddedVCを持っており、MainVCのviewDidLoadはembeddedVC.label2.text

class MyViewController: UIViewController { 
    @IBOutlet weak var label1: UILabel! 
    var embeddedVC: EmbeddedViewController? = nil 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     label1.text = "Hello" 
     embeddedVC?.label2.text = label1.text 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let embeddedVC = segue.destination as? EmbeddedViewController { 
      self.embeddedVC = embeddedVC 
     } 
    } 
} 

class EmbeddedViewController: UIViewController { 
    @IBOutlet weak var label2: UILabel! 

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

第二の溶液、使用プロトコルにます。Label1.Textを割り当て、viewWillAppearまたはviewDidAppearは(後のviewDidLoadが呼ばれる)ときMainVCのラベルテキストを取得し、呼び出されたとき

protocol EmbeddedVCDelegate: class { 
    func labelText() -> String? 
} 

class MyViewController: UIViewController, EmbeddedVCDelegate { 
    @IBOutlet weak var label1: UILabel! 

    // MARK: EmbeddedVCDelegate 
    func labelText() -> String? { 
     return label1.text 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     label1.text = "Hello" 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let embeddedVC = segue.destination as? EmbeddedViewController { 
      embeddedVC.delegate = self 
     } 
    } 
} 

class EmbeddedViewController: UIViewController { 
    @IBOutlet weak var label2: UILabel! 
    weak var delegate: EmbeddedVCDelegate? = nil 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     label2.text = delegate?.labelText() 
    } 
} 
関連する問題