Swift 在尝试向上移动布局时打开可选值时意外发现 nil

Posted

技术标签:

【中文标题】Swift 在尝试向上移动布局时打开可选值时意外发现 nil【英文标题】:Swift Unexpectedly found nil while unwrapping an optional value while trying to move up the layout 【发布时间】:2018-12-16 12:28:49 【问题描述】:

当键盘出现时我需要向上移动布局,并且由于键盘的大小而不会显示文本字段。因此我创建了这个:

    var activeField: UITextField!

在我的 ViewDidLoad 中:

 let center: NotificationCenter = NotificationCenter.default;
    center.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
    center.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)

方法如下:

 func textFieldDidBeginEditing(_ textField: UITextField) 
    activeField = textField


func textFieldShouldReturn(textField: UITextField) -> Bool 
    textField.resignFirstResponder()
    return true




@objc func keyboardWillShow(notification: Notification) 
    let info: NSDictionary = notification.userInfo as! NSDictionary
    let keyboardSize =  (info[UIResponder.keyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue

    let keyboardY = self.view.frame.size.height - keyboardSize.height

    let editingTextFieldY: CGFloat = self.activeField.frame.origin.y
    if editingTextFieldY > keyboardY - 60 

        UIView.animate(withDuration: 0.25) 
            self.view.frame = CGRect(x: 0, y: self.view.frame.origin.y - (editingTextFieldY - (keyboardY-60)), width: self.view.bounds.width, height: self.view.bounds.height)
        
    



@objc func keyboardWillHide(notification: Notification) 
    UIView.animate(withDuration: 0.25, animations: 
        self.view.frame = CGRect(x:0, y:0, width: self.view.bounds.width, height: self.view.bounds.height)
    , completion: nil)

错误出现在这一行:

        let editingTextFieldY: CGFloat = self.activeField.frame.origin.y

【问题讨论】:

在现代,实现这一点的唯一方法是:完美地为您的屏幕使用自动布局。有一个约束从底部塑造整个屏幕。非常简单地为那个 ONE CONSTRAINT 设置动画。你就完成了——就这么简单。自动布局什么都做。” 完整教程:***.com/a/41808338/294884 为什么还要手动显示和隐藏键盘?如果您在导航视图层次结构中,只需将 navigationItem.searchController 设置为 UISearchController 的实例,然后让 ios 为您完成所有繁重的工作。 【参考方案1】:

这个textFieldDidBeginEditing 没有被调用。

您需要在viewDidLoad中设置原始文本字段的委托

self.mainTexF.delegate = self

【讨论】:

它可能会被调用,但不会在初始键盘通知之前调用。 @Sulthan yes ,但答案总是猜测

以上是关于Swift 在尝试向上移动布局时打开可选值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章

Swift:致命错误:在展开可选值时意外发现 nil

Swift 和 UILabel - 致命错误:在展开可选值时意外发现 nil

Swift:致命错误:在初始化 UIlabel 值时展开可选值时意外发现 nil

Swift:“在展开可选值时意外发现 nil”在数组追加中

Swift 物理致命错误:当两个字符发生碰撞时,在展开可选值时意外发现 nil

self.view?.presentScene:在展开可选值时意外发现 nil (Swift)