iOS开发:实现keyboardWillShow后模拟器崩溃,无报错求排查
解决键盘通知导致App崩溃的问题
看起来你的崩溃大概率和buttomConstraint这个变量有关,先从这里排查起,下面是具体的分析和修复方案:
最可能的崩溃原因:约束未正确连接
你代码里的buttomConstraint(注意拼写是buttom而非标准的bottom)很可能是未正确连接的IBOutlet,或是变量名拼写错误导致它处于nil状态。当你尝试给nil的约束设置constant值时,就会触发崩溃。
修复步骤:
- 检查Storyboard/XIB里的约束连接:找到你要调整的底部约束,确认它已经正确连接到ViewController的
buttomConstraint变量上(如果拼写是故意的,要保证前后一致;建议改成标准的bottomConstraint避免混淆)。 - 给约束变量增加安全判断:如果不确定连接是否可靠,可以修改变量定义为
@IBOutlet weak var bottomConstraint: NSLayoutConstraint?,然后在设置constant前加判断:
guard let constraint = bottomConstraint else { return } constraint.constant = keyboardHeight
其他补充优化点
- 移除通知避免内存泄漏:虽然这不是当前崩溃的直接原因,但你在
viewDidLoad里添加了通知观察者,记得在deinit里移除它:
deinit { NotificationCenter.default.removeObserver(self) }
- 键盘高度适配安全区域:在iOS 13+的设备上,底部可能存在安全区域,直接用键盘高度会导致布局偏移过多,可以做适配:
let keyboardRect = keyboardFrame.cgRectValue let keyboardHeight = view.safeAreaInsets.bottom > 0 ? keyboardRect.height - view.safeAreaInsets.bottom : keyboardRect.height
- 用系统常量替代硬编码字符串:把
"UIKeyboardFrameEndUserInfoKey"换成系统提供的UIResponder.keyboardFrameEndUserInfoKey,避免拼写错误。
修复后的完整代码示例
override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver( self, selector: #selector(keyboardWillShow(with:)), name: UIResponder.keyboardWillShowNotification, object: nil) } @objc func keyboardWillShow(with notification: Notification) { let key = UIResponder.keyboardFrameEndUserInfoKey guard let keyboardFrame = notification.userInfo?[key] as? NSValue, let bottomConstraint = bottomConstraint else { return } let keyboardRect = keyboardFrame.cgRectValue let keyboardHeight = view.safeAreaInsets.bottom > 0 ? keyboardRect.height - view.safeAreaInsets.bottom : keyboardRect.height bottomConstraint.constant = keyboardHeight UIView.animate(withDuration: 0.2) { self.view.layoutIfNeeded() } } deinit { NotificationCenter.default.removeObserver(self) }
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

