xcode 使用UITextFieldDelegete时出现致命错误[重复]

qmelpv7a  于 2023-03-04  发布在  其他
关注(0)|答案(1)|浏览(122)
    • 此问题在此处已有答案**:

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

bwleehnv

bwleehnv1#

编辑:

这个问题是一个关于如何不问SO问题的案例研究。OP提供了不完整的信息,几个人参与了一个包含20个问题的扩展游戏,试图找出发生了什么。
OP提示:你需要编辑你的问题,并把我们从你那里得到的所有信息都写在下面的评论中**在原来的问题里。**这对本帖的未来读者很重要。如果读者必须费力地阅读几十条评论才能弄清楚问题的细节,那么这个问题就很难理解了。

崩溃的原因:

您在其中一条注解中指出,您使用present(LoginScreenViewController(), animated: true)行表示视图控制器。
它通过调用LoginScreenViewController的默认初始化式LoginScreenViewController()来创建LoginScreenViewController的示例。
对于从情节串连图板加载视图的视图控制器,您不能这样做。**调用默认初始化器将不会从情节串连图板加载视图。**所有插座将为空。视图控制器的内容视图将为空。

修复:

您需要通过调用UIStoryboard示例化方法之一(如instantiateViewController(withIdentifier:))从故事板加载视图控制器。
另外,IBOutlets默认设置为"隐式解 Package 可选项",这意味着当您试图引用该出口时,编译器将静默地(隐式地)尝试解 Package 它们,如果它们为空,则代码将崩溃。
如果引用插座的代码崩溃了,它很可能是空的。你需要弄清楚为什么它是空的。
textFieldShouldReturn(_:)方法中,同时引用了phoneAndEmailTextFieldpasswordTextField,它们都被声明为隐式展开的可选项,这意味着如果故事板中没有连接这两个插座中的任何一个,该函数就会崩溃。
尝试如下重写该函数:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    guard let phoneAndEmailTextField = phoneAndEmailTextField else {
        print("phoneAndEmailTextField is nil")
        return false
    }
    guard let passwordTextField = passwordTextField else {
        print("passwordTextField is nil")
        return false
    }

    
    phoneAndEmailTextField?.endEditing(true)
    passwordTextField?.endEditing(true)
    
    return true
}

(Note对于隐式展开的可选函数,如果像我在函数的编辑版本中那样用问号引用它们,编译器仍然会进行可选链接,如果引用的对象为nil,则会跳过函数调用/属性引用。)

编辑:

如果是phoneAndEmailTextField.delegate = self语句崩溃了,那么phoneAndEmailTextField就是nil。你一定是在连接IBOutlets时做错了什么。在你的问题中添加一个视图控制器的截图,并显示连接检查器,这样我们就可以看到这两个插座的连接。
您可以通过将该行重写为phoneAndEmailTextField?.delegate = self来修复崩溃,但是phoneAndEmailTextField出口仍然为空,因此您将只修补问题,而不是修复它。
顺便说一句,你可以将文本字段代理连接到故事板中的视图控制器上。只需选择文本字段,选择连接检查器,然后从代理连接拖动到故事板中的视图控制器上。

相关问题