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 和 UILabel - 致命错误:在展开可选值时意外发现 nil
Swift:致命错误:在初始化 UIlabel 值时展开可选值时意外发现 nil