You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:52:33