2014-10-22 45 views
1

我有一个应用程序崩溃,当我尝试处理键盘通知。我使用的是xCode 6.0,该项目在Swift中。键盘通知导致EXC_BAD_ACCESS崩溃

试图隔离问题我创建了一个新应用程序,其中只包含一个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,但结果始终相同。

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

+0

请你分享你试过的样品项目吗? – 2014-10-22 05:30:56

+0

你的第一个问题是UIKeyboardWillChangeFrameNotification应该是UIKeyboardWillShowNotification。 – DBoyer 2014-10-22 05:38:27

+0

谢谢Anil和@DBoyer。我尝试了两个通知(甚至还有一些键盘相关的通知)。但我的实际问题是'addObserver'中选择器的错误用法。它接受一个参数,所以应该是选择器:“keyboardWillAppear:”而不是我在问题中使用的。 – Olga 2014-10-22 23:47:24

回答

1

您正在使功能keyboardWillAppear()返回选择器。尝试使用字符串:Selector("keyboardWillAppear:")

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

+0

谢谢你的建议,我会把它移到那里。 – Olga 2014-10-22 23:43:40

+0

我发现了我自己的错误。我应该使用:NSNotificationCenter.defaultCenter()。addObserver(self,selector:“keyboardWillAppear:”,名称:UIKeyboardWillChangeFrameNotification,object:nil) - 即keyboardWillAppear是一个带参数的函数,这就是为什么我认为错误是:它尝试访问参数,但没有通过。 – Olga 2014-10-22 23:44:55

0

第一种解决方法是在将头撞到墙上之前先睡觉。

在早上我想出了我的问题。我做错了什么是错误的选择器注册通知。有一个参数传递给通知处理程序,所以选择器应该是:selector:"keyboardWillAppear:",带冒号,指定这是一个带参数的函数。

所以不是:

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

,我应该使用:

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

谢谢大家谁试图帮助,我希望这将有助于新斯威夫特其他人。