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

时间:2011-10-06 15:40:28

标签: objective-c ios unrecognized-selector

我正在尝试在用户按下“取消”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我用来将我的scrollView移动到用户当前正在编辑的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;
}

3 个答案:

答案 0 :(得分:1)

什么是activeField?如果它是UIResponder,它应该响应resignFirstResponder。所以也许不是。 UIViews和UIViewControllers是UIResponders。

答案 1 :(得分: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 :(得分:0)

晨星是对的,什么是activeField,它是一个id,你可能需要添加一个演员:(UIButton*)?此外,我总是resignFirstResponder

时添加此内容
if(myObject canResignFirstResponder){

}