2016-05-18 2 views
0

У меня есть viewController с UISegmentedControl и UIButton. Внутри этого viewController у меня есть два контейнера, каждый из которых содержит один viewController с UITextField внутри.Container view loss textField значения, когда кнопка нажата в родительском представленииController

enter image description here

Я хочу, чтобы сохранить значения в текстовое поле на нажатие кнопки.

Вот код, который я написал до сих пор:

View Controller:

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

Вы не должны пытаться манипулировать представлениями другого контроллера. Это нарушает принцип инкапсуляции, важный принцип объектно-ориентированного развития.

Вы должны указать свойства строковых контроллеров вашего дочернего элемента (ContainerAViewController и ContainerBViewController) и иметь код для этих контроллеров представлений, которые задают это строковое свойство, когда пользователь вводит текст в текстовые поля диспетчера представлений.

Игнорируя этот дефект дизайна, ваш код не имеет смысла. Вы показываете свой КЛАСС как ContainerAViewController, и все же ваш метод buttonTapped пытается задать однотонный ContainerAViewController для значения текстового поля. Это бессмысленно.

Вы хотите иметь свойства в контроллере родительского представления, которые указывают на контроллеры вашего дочернего представления.

Вы должны внедрить метод prepareForSegue в своем родительском контроллере представления, а в методе prepareForSegue - искать встраиваемые сегменты, которые срабатывают при загрузке контроллеров дочерних представлений. Когда это произойдет, вы должны установить свои свойства, которые указывают на контроллеры дочерних представлений.