【问题标题】:Keyboard notifications cause EXC_BAD_ACCESS crash键盘通知导致 EXC_BAD_ACCESS 崩溃
【发布时间】:2014-10-22 05:28:00
【问题描述】:

我有一个应用程序在我尝试处理键盘通知时崩溃。我正在使用 xCode 6.0,该项目在 Swift 中。

为了解决这个问题,我创建了一个新应用,它只包含一个 UITextView 和 4 个约束,这些约束将视图固定到顶部、左右边缘并设置固定高度。

我的ViewController 拥有以下内容:

import UIKit

class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    self.observeKeyboard()
  }
  override func viewDidDisappear(animated: Bool) {
    NSNotificationCenter().removeObserver(self)
  }

  func observeKeyboard() {
     NSNotificationCenter.defaultCenter().addObserver(self, selector:Selector(keyboardWillAppear()), name:UIKeyboardWillChangeFrameNotification, object:nil)
  }

  func keyboardWillAppear() {
    println("keyboardWillAppear")
  }
}

当我在模拟器中启动应用程序时,

keyboardWillAppear

打印到控制台,当我在文本视图中点击时,应用程序崩溃:

EXC_BAD_ACCESS code=1:

错误:memory read failed for 0x0

显示键盘,但另一个keyBoardWillAppear 未打印到控制台。

这个应用程序中没有其他内容,只有上面的代码和 4 个约束。我刚刚打开了一个全新的项目,试图找出我在其他应用程序中遇到的问题。我也尝试订阅viewDidAppear中的通知,我也尝试使用另一个通知UIKeyboardWillShowNotificationUIKeyboardDidShowNotification,但结果总是一样。

我错过了什么?感谢您的帮助!

【问题讨论】:

  • 能否分享一下您尝试过的示例项目?
  • 你的第一个问题是 UIKeyboardWillChangeFrameNotification 应该是 UIKeyboardWillShowNotification。
  • 谢谢 Anil 和@DBoyer。我尝试了两种通知(甚至更多与键盘相关的通知)。但我的实际问题是“addObserver”中选择器的错误使用。它接受一个参数,所以应该是 selector:"keyboardWillAppear:" 而不是我在问题中使用的。

标签: ios iphone swift xcode6


【解决方案1】:

您正在制作返回函数keyboardWillAppear() 的选择器。尝试使用字符串:Selector("keyboardWillAppear:")

另外说明:您在viewDidLoad 中注册键盘通知,通常每个视图控制器生命周期只调用一次。最好在viewWillAppear:注册这些通知。

【讨论】:

  • 谢谢你的建议,我把它移到那里。
  • 我发现了自己的错误。我应该使用: NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillAppear:", name: UIKeyboardWillChangeFrameNotification, object: nil) - 也就是说,keyboardWillAppear 是一个带参数的函数,这就是为什么我认为错误是:它尝试访问参数,但没有通过。
【解决方案2】:

第一个解决办法是在撞到墙上之前睡觉。

早上我发现了我的问题。我做错的是使用错误的选择器注册通知。有一个参数传递给通知处理程序,所以选择器应该是:selector:"keyboardWillAppear:",用冒号表示这是一个带参数的函数。

所以而不是:

NSNotificationCenter.defaultCenter().addObserver(self, selector:Selector(keyboardWillAppear()), name:UIKeyboardWillChangeFrameNotification, object:nil)

我应该使用:

NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillAppear:", name: UIKeyboardWillChangeFrameNotification, object: nil)

感谢所有试图提供帮助的人,我希望这能帮助其他刚接触 Swift 的人。

【讨论】:

    猜你喜欢
    • 2015-12-09
    • 1970-01-01
    • 2014-12-15
    • 2023-03-12
    • 1970-01-01
    • 2018-03-25
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多