我正在尝试在用户按下“取消”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;
}
答案 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){
}