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