iOS - keyboardWillShow:无法识别的选择器发送到实例

时间:2014-02-06 22:10:59

标签: ios objective-c unrecognized-selector

In my application I am adding following observer in init method of class A.


 [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShow:)
                                                 name:UIKeyboardWillShowNotification
                                               object:nil];
 [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillHide:)
                                                 name:UIKeyboardWillHideNotification
                                               object:nil];

然后我从类A扩展了一个类B. keyboardWillShow和keyboardWillHide方法是用超类写的,即A类。但是当我点击一些textview输入文本时,应用程序抛出异常。

terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[B   keyboardWillShow:]: unrecognized selector sent to instance xyz'

由于方法已经在B的超类中编写,这是混乱的。如果它是由于无效的参数,那么如何将参数传递给iOS本身。

4 个答案:

答案 0 :(得分:3)

很难从这一段代码中分辨出来,但看起来你的方法名称有错误。在您提供的代码中,您使用名为“keyboardWillToggle:”的方法注册通知。该错误表明您正在尝试调用“keyboardWillShow:”方法。

最好在A类上声明并实现“keyboardWillShow:”和“keyboardWillHide:”,然后注册这样的通知:

 [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillShow:)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];
 [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillHide:)
                                             name:UIKeyboardWillHideNotification
                                           object:nil];

答案 1 :(得分:1)

您似乎需要在类中声明/定义名为keyboardWillShow:的方法。

答案 2 :(得分:0)

这恰好发生在我身上,方法确实存在,但它们没有在我的.h文件中声明。 意思是,该方法应该是公共的,NSNotificationCenter可以访问。

答案 3 :(得分:0)

失败的原因是因为您没有在自己找到的新控制器中实现这些方法。离开该控制器后,您必须删除这些观察者。否则,在您需要使用键盘的任何其他控制器中,将触发这些观察,并且它们将在您的类中搜索这些方法,但如果您没有定义它们,则会抛出您描述的错误。