在父级中点击按钮时容器视图丢失 textField 值 viewController
Container view losing textField values when a button is tapped in the parent viewController
我有一个 viewController,一个 UISegmentedControl
和一个 UIButton
。
在这个 viewController 中,我有两个容器,每个容器包含一个 viewController,里面有一个 UITextField
。
我想在单击按钮时将值保存在文本字段中。
这是我目前编写的代码:
视图控制器:
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
有人可以帮忙吗?
您不应尝试操纵另一个视图控制器的视图。这违反了面向对象开发中的重要原则封装原则。
您应该为您的子视图控制器(ContainerAViewController 和 ContainerBViewController)提供字符串属性,并让这些视图控制器的代码在用户向视图控制器的文本字段中输入文本时设置该字符串 属性。
忽略该设计缺陷,您的代码没有意义。您将 CLASS 显示为 ContainerAViewController
,但您的 buttonTapped 方法试图向 ContainerAViewController
单例询问文本字段的值。这毫无意义。
您想在父视图控制器中拥有指向子视图控制器的属性。
您应该在父视图控制器中实现 prepareForSegue 方法,并在该 prepareForSegue 方法中查找在加载子视图控制器时触发的嵌入转场。当发生这种情况时,您应该设置指向子视图控制器的属性。
我有一个 viewController,一个 UISegmentedControl
和一个 UIButton
。
在这个 viewController 中,我有两个容器,每个容器包含一个 viewController,里面有一个 UITextField
。
我想在单击按钮时将值保存在文本字段中。
这是我目前编写的代码:
视图控制器:
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
有人可以帮忙吗?
您不应尝试操纵另一个视图控制器的视图。这违反了面向对象开发中的重要原则封装原则。
您应该为您的子视图控制器(ContainerAViewController 和 ContainerBViewController)提供字符串属性,并让这些视图控制器的代码在用户向视图控制器的文本字段中输入文本时设置该字符串 属性。
忽略该设计缺陷,您的代码没有意义。您将 CLASS 显示为 ContainerAViewController
,但您的 buttonTapped 方法试图向 ContainerAViewController
单例询问文本字段的值。这毫无意义。
您想在父视图控制器中拥有指向子视图控制器的属性。
您应该在父视图控制器中实现 prepareForSegue 方法,并在该 prepareForSegue 方法中查找在加载子视图控制器时触发的嵌入转场。当发生这种情况时,您应该设置指向子视图控制器的属性。