2017-12-19 6 views
4

メインviewControllerに1つのボタンがあり、デフォルト値はnilで、これはdropDownポッドに関連付けられています。 同じviewControllerにはコンテナビューもあります。異なる値のコンテナビューに同じ変数を渡す

最初に読み込むときに、共有環境設定から変数のデフォルト値を取得し、その値をコンテナビューにperformSegueで渡します。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if(segue.identifier == "dataToContainerView"){ 
    DispatchQueue.main.async { 

    var secondVC = segue.destination as! secondViewController //container viewController 
     secondVC.variable = self.variable 
    } 
    } 
} 

今、私は、ユーザーによってdropdownボタンから選択することで、再び同じ変数の値を渡す必要があります。

dropDown.selectionAction = { [unowned self] (index, item) in 
     self.button.setTitle(item, for: UIControlState()) 
     self.variable = item 
     print(item) 
     self.performSegue(withIdentifier: "dataToContainerView", sender: nil) 
    //performing segue to resend the new value of the variable. 
    } 

上記のコードは、print(item)まで正しく実行されます。 しかしperformSegueで次のエラーが発生しています。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'There are unexpected subviews in the container view. Perhaps the embed segue has already fired once or a subview was added programmatically? 

にはどうすればdropDownポッドの助けを借りて最初の値を上書きコンテナビュー二度目に値を渡す必要がありますか?

update: - 変数viewControllerのjsonパーサに渡すことができるように変数値が必要です。また、コンテナviewControllerのコードが再実行されます。

+0

あなたが代表者を通してそれを渡すことができます。 –

+0

エラーが示すように、あなたはそれを行うことはできません。解決方法は、カスタムクロージャを設定するか、デリゲートを使用することです。 – Larme

+1

@DharmeshKheni解決策を理解するためのコードを教えてください。 – Error

答えて

2

エンベデッドコントローラへの参照を保存して、後で再度アップデートできるようにする必要があります。あなたは変数を更新する必要がある場合その後、あなただけのそれを直接参照することができ

// Declare a local variable in your parent container: 
var secondVC: secondViewController! 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if(segue.identifier == "dataToContainerView"){ 
     DispatchQueue.main.async { 
      self.secondVC = segue.destination as! secondViewController 
      //container viewController 
      self.secondVC.variable = self.variable 
     } 
    } 
} 

:最初のセグエでこれを行う

self.secondVC.variable = self.variable 
self.secondVC.viewDidLoad() 
+0

私はこれを行いましたが、コンテナビューでした2番目の値でリフレッシュされません(私がセグを再度通過した理由)。実際には、コンテナビューのJsonパーサーでこの値を渡しています。コンテナviewControllerのコードは実行されません。最新の質問を確認してください。 – Error

+0

2番目のビューに値を更新するための関数がありますか?コードを更新してJSON値を処理するコードをsecondVCに表示してください。変数を変更するたびにその関数を再度呼び出していることを確認する必要があります。 – davidethell

+0

はい、コンテナViewControllerには機能があります。同じviewControllerから3つ、main viewControllerから1つ、4つの変数が必要です。 segueを実行すると、初めて実行されます。だから、あなたが私の問題を解決するために値を再度割り当てた後、その機能を再び実行する方法を手伝ってくれたら。 – Error

関連する問題