致命错误:在解包可选值时意外发现nil(验证空文本字段时)

时间:2014-10-13 20:21:34

标签: ios swift

我正在尝试验证空文本字段,即如果文本字段为空,则显示警告消息,但我收到错误

  

致命错误:在解包可选值时意外发现nil

这是我的代码:

 dateComponents.month = String(monthTextField.text!).toInt()!
    dateComponents.day = String(dayTextField.text!).toInt()!
    dateComponents.year = String(yearTextField.text!).toInt()!

    if self.monthTextField.text == ""{
        let alertController = UIAlertController(title: "Month", message:
            "Please enter 2 digits in the 'mm' field, e.g. 01 for January", preferredStyle: UIAlertControllerStyle.Alert)
        alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default,handler: nil))

        self.presentViewController(alertController, animated: true, completion: nil)
    }

2 个答案:

答案 0 :(得分:1)

如果monthTextField的{​​{1}}属性为空字符串(text),则问题代码中的第一行会抛出致命错误&#39重看这是因为""将返回toInt()并且您正试图强制用nil解包(这将导致崩溃)。

使用强制解包就像你正在做的那样会成为一个问题。如果您的文本字段为!或其nil属性中包含非数字字符串,则表示该致命错误。我会通过使用可选绑定和可选链接的组合来验证文本字段中的文本(以及文本字段本身,如果需要)。这看起来像这样:

text

该代码不会崩溃,因为它确保它的每一步都不会展开var monthTextFields: UITextField? // Set via code or xib or storyboard, doesn't matter if let month = monthTextField?.text?.toInt() { /* month is now an Int that you can safely use */ } else { /* the text is not a valid Int, display your alert */ } 值。 nil行基本上说的是:"如果if不是monthTextField且其nil属性不是text并且调用{{1}在其nil属性上不会返回toInt(),然后将text设置为nil"的结果。

答案 1 :(得分:0)

空字符串无法转换为int。因此,即使在您展开之前,您的代码也会失败。我建议你改变你的代码来打开整数而不是字符串,它应该可以工作。