我有一个带有UIButton
和UITextField
的viewController。
在这个viewController中,我有两个容器,每个容器包含一个内部有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
}
}
的viewController。
我想在点击按钮时保存textField中的值。
这是我到目前为止编写的代码:
查看控制器:
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.
}
}
ContainerAViewController:
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.
}
}
ContainerBViewController:
row.Index
当我点击按钮时,它会出现以下错误:
致命错误:在解包可选值时意外发现nil
有人可以帮忙吗?
答案 0 :(得分:1)
您不应该尝试操纵另一个视图控制器的视图。这违反了封装原则,这是面向对象开发的一个重要原则。
您应该为您的子视图控制器(ContainerAViewController和ContainerBViewController)提供字符串属性,并让这些视图控制器的代码在用户将文本输入视图控制器的文本字段时设置该字符串属性。
忽略该设计缺陷,您的代码没有意义。您将CLASS显示为ContainerAViewController
,但您的buttonTapped方法正在尝试向ContainerAViewController
单例询问文本字段的值。这毫无意义。
您希望父视图控制器中的属性指向您的子视图控制器。
您应该在父视图控制器中实现prepareForSegue方法,并在该prepareForSegue方法中查找加载子视图控制器时触发的嵌入segue。发生这种情况时,您应该设置指向子视图控制器的属性。