2016-05-18 20 views
0

私はUISegmentedControlUIButtonのviewControllerを持っています。 このviewController内には、2つのコンテナがあり、それぞれにUITextFieldという1つのviewControllerが含まれています。コンテナビュー親ビューでボタンがタップされたときにtextField値が失われる

enter image description here

私は、ボタンのクリックでテキストフィールドに値を保存したいです。

ここで私がこれまでに書いたコードです:

ビューコントローラ:

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     // 
     // 

     containerA.showView() 
     containerB.hideView() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    @IBAction func buttonTapped(sender: UIButton) { 
     print(ContainerAViewController.sharedInstance.textFieldA) 


    } 
    @IBAction func segmentedControlValueChanged(sender: AnyObject) { 
     switch(sender.selectedSegmentIndex) { 
     case 0 : containerA.showView() 
      containerB.hideView() 

     case 1 : containerB.showView() 
     containerA.hideView() 

     default : containerA.showView() 
     containerB.hideView() 

     } 
    } 

    @IBOutlet weak var containerA: UIView! 
    @IBOutlet weak var containerB: UIView! 


    func hideView(view: UIView) { 
     view.userInteractionEnabled = false 
     view.hidden = true 
    } 

    func showView(view: UIView) { 
     view.userInteractionEnabled = true 
     view.hidden = false 
    } 

} 


extension UIView { 
    func hideView() -> UIView { 
     self.userInteractionEnabled = false 
     self.hidden = true 
     return self 
    } 

    func showView() -> UIView { 
     self.userInteractionEnabled = true 
     self.hidden = false 
     return self 
    } 

} 

ContainerAViewController:

class ContainerAViewController: UIViewController { 

    @IBOutlet weak var textFieldA: UITextField! 

    static let sharedInstance = ContainerAViewController() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
    } 
} 

ContainerBViewController:

は、
class ContainerBViewController: UIViewController { 

    @IBOutlet weak var textFieldB: UITextField! 

    static let sharedInstance = ContainerBViewController() 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
    } 
} 

私はボタンをタップすると、それは私に次のエラーを与える:

fatal error: unexpectedly found nil while unwrapping an Optional value

誰かが助けてくださいことはできますか?

答えて

0

他のView Controllerのビューを操作しないでください。これはオブジェクト指向開発の重要な原則であるカプセル化の原則に違反します。

子供がView Controller(ContainerAViewControllerおよびContainerBViewController)の文字列プロパティを設定し、ユーザーがView Controllerのテキストフィールドにテキストを入力するときに、それらのView Controller用のコードでその文字列プロパティを設定する必要があります。

この設計上の欠陥を無視して、あなたのコードは意味をなさない。あなたはCLASSをContainerAViewControllerと表示しますが、buttonTappedメソッドはテキストフィールドの値をシングルトンContainerAViewControllerに依頼しています。それは意味をなさない。

子ビューコントローラーを指す親ビューコントローラー内のプロパティーが必要です。

親ビューコントローラでprepareForSegueメソッドを実装し、そのprepareForSegueメソッドで子ビューコントローラが読み込まれるときに発生する埋め込みセグを探します。それが起こると、子ビューコントローラを指すプロパティを設定する必要があります。

関連する問題