我想验证父视图控制器中容器中的表单。当单击父视图控制器中的按钮时,如何验证表单(检查所有字段不是nil
)。该按钮在父视图控制器中有一个IBOutlet
,它从表单的类中调用一个方法。
@IBAction func submitOrder(sender: AnyObject) {
let formView = FormViewController()
formView.getFieldValues()
}
方法是,
func getFieldValues() {
if (self.nameField.text == "") {
print("Name field is empty")
}
}
子视图中的nameField
具有IBOutlet,
@IBOutlet weak var nameField: UITextField!
单击父视图控制器中的按钮时,我得到经典错误
致命错误:在解包可选值时意外发现nil
因此,这与选项或父视图控制器无法识别容器视图中的文本字段有关。
答案 0 :(得分:2)
当你写道:
let formView = FormViewController()
formView.getFieldValues()
您创建了一个全新的FormViewController,它未从Storyboard加载,因此没有连接出口。但是,即使它们与某些东西联系在一起,也会出现在新的文本字段中,而不是屏幕上的字段。
你不应该创建一个新的 - 你应该访问你正在显示的那个。
如果没有更多代码,我们无法提供帮助,但是在父级中您创建了正在显示的表单视图,请保留对它的引用,以便以后可以访问它。
答案 1 :(得分:0)
一种方法是您可以使用textfield的委托方法临时保存文本字段数据(无论用户输入什么)(如用户默认值)。
单击按钮时,您只需要检查存储的数据,如果没有输入任何内容,则返回nil或空字符串,无论它是什么,您都可以识别并验证文本字段。
答案 2 :(得分:0)
Lou对于问题的根源是正确的FormViewController
是新的,未连接的实例。要让父视图控制器识别容器视图的uiTextFields
,您必须使用prepareForSegue
。在故事板中命名containerView
segue后,您必须实现此方法。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "formView" {
formView = segue.destinationViewController as? FormViewController
}
}
formView
是在类中声明的FormViewController的空实例。建立此连接允许父视图类获取UITextFields
FormViewController
的值