尝试关闭键盘时出现“无法识别的选择器”错误
Posted
技术标签:
【中文标题】尝试关闭键盘时出现“无法识别的选择器”错误【英文标题】:"unrecognized selector" error when trying to dismiss keyboard 【发布时间】:2011-10-06 15:40:27 【问题描述】:当用户按下“取消”UIBarButtonItem 时,我试图关闭键盘。但是,当我单击取消按钮时,我收到一个带有“无法识别的选择器发送到实例”错误的 SIGABRT。
我创建取消按钮的代码是:
- (void)keyboardWasShown:(NSNotification*)aNotification
//Add cancel button to navigation bar
UIBarButtonItem *dismissKeyboardBttn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(dismissKeyboard:)];
self.navigationItem.rightBarButtonItem = dismissKeyboardBttn;
要关闭键盘,我有这个方法:
- (void)dismissKeyboard:(id)sender
[activeField resignFirstResponder];
//^^This line causes the SIGABRT^^
看起来很简单。有什么想法吗?
更新:activeField 只是我用来将滚动视图移动到用户当前正在编辑的 UITextField 的 UITextField。在这两种方法中设置:
- (void)textFieldDidBeginEditing:(UITextField *)textField
activeField = textField;
- (void)textFieldDidEndEditing:(UITextField *)textField
activeField = nil;
更新 2:有趣的是,我已经注册了 ViewController 以接收键盘通知,当我尝试使用“textFieldShouldReturn”方法关闭键盘时,我得到了同样的错误。这是我的 textFieldShouldReturn 代码:
- (BOOL)textFieldShouldReturn:(UITextField *)textField
if ([textField canResignFirstResponder])
[textField resignFirstResponder];
return YES;
【问题讨论】:
你能贴出你分配activeField的代码吗? 【参考方案1】:我处于一种情况,在当前视图控制器中执行如下操作:
在头文件中,为成为第一响应者的文本字段创建一个 IBAction 并调出键盘:
- (IBAction)textFieldDidBeginEditing:(UITextField *)textField;
在实现文件中,创建一个创建栏按钮(在我的例子中是“完成”按钮)并将其添加到导航栏右侧的方法。同时,我在TextField(已经成为第一响应者)之间创建了一个目标动作配对
- (void)textFieldDidBeginEditing:(UITextField *)textField
// create new bar button with "Done" as text
// set the target of the action as the text field (since we want the text field to resign first responder status and dismiss the keyboard)
// tell the text field to resign with the stock 'resignFirstResponder' selector
UIBarButtonItem *bbi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:textField
action:@selector(resignFirstResponder)];
// add the button with target/action pairing to the navigation bar
[[self navigationItem] setRightBarButtonItem:bbi];
此外,如果您希望按钮在我单击后消失(键盘消失),我使用 textFieldDidEndEditing,因为编辑现在已经完成,第一响应者识别:
- (void)textFieldDidEndEditing:(UITextField *)textField
[[self navigationItem] setRightBarButtonItem:nil];
【讨论】:
【参考方案2】:什么是activeField?如果是 UIResponder,它应该响应 resignFirstResponder。所以也许不是。 UIViews 和 UIViewControllers 是 UIResponders。
【讨论】:
activeField 只是我用来将滚动视图移动到用户当前正在编辑的 UITextField 的 UITextField。我在上面设置的地方发布了代码。 收到错误时是否检查过 activeField 是否为 nil? nil 被编程为在大多数情况下默默地忽略选择器,但我不确定。 是的,我确实检查过,它不是零。它设置为我正在编辑的文本字段。我每天都在看这个,不知道哪里出了问题。不过,关于 textFieldShouldReturn 的内容缩小了范围。【参考方案3】:Morningstar 是对的,activeField 是什么,它是一个 id,你可能需要添加一个演员:(UIButton*)
?另外,我总是在resignFirstResponder
时添加这个:
if(myObject canResignFirstResponder)
【讨论】:
activeField 只是我用来将滚动视图移动到用户当前正在编辑的 UITextField 的 UITextField。我在上面设置的地方发布了代码。 我还在调用 resignFirstResponder 时加上了安全“if”语句,但我仍然遇到同样的错误。 我找不到您的电子邮件地址。以上是关于尝试关闭键盘时出现“无法识别的选择器”错误的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 名称标签时出现“无法识别的选择器发送到实例”错误
使用 UIImageWriteToSavedPhotosAlbum 保存图像时出现无法识别的选择器错误
使用 UILocalizedIndexedCollation 在 Swift 4.2 中创建 tableView 部分索引时出现错误“无法识别的选择器发送到实例”