键盘通知导致EXC_BAD_ACCESS崩溃

时间:2014-10-22 05:28:01

标签: ios iphone swift xcode6

当我尝试处理键盘通知时,我的应用程序崩溃了。我使用的是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,但结果始终相同。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

所以而不是:

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

我应该使用:

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

感谢所有试图提供帮助的人,我希望这将有助于其他新手Swift。