- 此问题在此处已有答案**:
What does "Fatal error: Unexpectedly found nil while unwrapping an Optional value" mean?(16个答案)
昨天关门了。
我在ViewController中设置了一个UITextField,Xcode没有显示错误。但是当我运行应用并加载Screen时,应用崩溃并显示错误消息:
致命错误:隐式展开可选值时意外找到nil
这是我的代码:
import Foundation
import UIKit
class LoginScreenViewController: UIViewController, UITextFieldDelegate{
@IBOutlet weak var phoneAndEmailTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
phoneAndEmailTextField.delegate = self
passwordTextField.delegate = self
}
@IBAction func phoneAndEmailTextFieldAction(_ sender: UITextField) {
phoneAndEmailTextField.endEditing(true)
print(phoneAndEmailTextField.text!)
}
@IBAction func passwordTextFieldAction(_ sender: UITextField) {
passwordTextField.endEditing(true)
print(passwordTextField.text!)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
phoneAndEmailTextField.endEditing(true)
passwordTextField.endEditing(true)
return true
}
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
if textField.text != "" {
return true
}else {
return false
}
}
func textFieldDidEndEditing(_ textField: UITextField) {
// sql
}
}
这是一个TextField引用的Outlets。另一个相同... Storyboard
1条答案
按热度按时间bwleehnv1#
编辑:
这个问题是一个关于如何不问SO问题的案例研究。OP提供了不完整的信息,几个人参与了一个包含20个问题的扩展游戏,试图找出发生了什么。
OP提示:你需要编辑你的问题,并把我们从你那里得到的所有信息都写在下面的评论中**在原来的问题里。**这对本帖的未来读者很重要。如果读者必须费力地阅读几十条评论才能弄清楚问题的细节,那么这个问题就很难理解了。
崩溃的原因:
您在其中一条注解中指出,您使用
present(LoginScreenViewController(), animated: true)
行表示视图控制器。它通过调用
LoginScreenViewController
的默认初始化式LoginScreenViewController()
来创建LoginScreenViewController
的示例。对于从情节串连图板加载视图的视图控制器,您不能这样做。**调用默认初始化器将不会从情节串连图板加载视图。**所有插座将为空。视图控制器的内容视图将为空。
修复:
您需要通过调用
UIStoryboard
示例化方法之一(如instantiateViewController(withIdentifier:)
)从故事板加载视图控制器。另外,IBOutlets默认设置为"隐式解 Package 可选项",这意味着当您试图引用该出口时,编译器将静默地(隐式地)尝试解 Package 它们,如果它们为空,则代码将崩溃。
如果引用插座的代码崩溃了,它很可能是空的。你需要弄清楚为什么它是空的。
在
textFieldShouldReturn(_:)
方法中,同时引用了phoneAndEmailTextField
和passwordTextField
,它们都被声明为隐式展开的可选项,这意味着如果故事板中没有连接这两个插座中的任何一个,该函数就会崩溃。尝试如下重写该函数:
(Note对于隐式展开的可选函数,如果像我在函数的编辑版本中那样用问号引用它们,编译器仍然会进行可选链接,如果引用的对象为nil,则会跳过函数调用/属性引用。)
编辑:
如果是
phoneAndEmailTextField.delegate = self
语句崩溃了,那么phoneAndEmailTextField
就是nil。你一定是在连接IBOutlets时做错了什么。在你的问题中添加一个视图控制器的截图,并显示连接检查器,这样我们就可以看到这两个插座的连接。您可以通过将该行重写为
phoneAndEmailTextField?.delegate = self
来修复崩溃,但是phoneAndEmailTextField出口仍然为空,因此您将只修补问题,而不是修复它。顺便说一句,你可以将文本字段代理连接到故事板中的视图控制器上。只需选择文本字段,选择连接检查器,然后从代理连接拖动到故事板中的视图控制器上。