尝试关闭键盘时出现“无法识别的选择器”错误

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 保存图像时出现无法识别的选择器错误

使用 UILocalizedIndexedCollat​​ion 在 Swift 4.2 中创建 tableView 部分索引时出现错误“无法识别的选择器发送到实例”