resignFirstResponder没有在textFieldShouldClear中调用

时间:2014-07-26 08:33:46

标签: objective-c ios7 uitextfield clear uitextfielddelegate

我正在尝试在我的某个页面中实现搜索栏。

由于其设计,我没有使用常规搜索栏。

我的拥有如下。

UIImageView above UIView (textfield background)
UITextField above UIImageView (textfield)

我正在delegates使用UITextField

在代码中我searchTF.clearButtonMode = UITextFieldViewModeWhileEditing;显示清除按钮。

搜索工作正常,但问题在于清除按钮的代理。

我有以下代码

- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    if (textField == searchTF) {

        NSLog(@"clicked clear button");
        [textField resignFirstResponder]; // this is not working
        // also below is not working
        // [searchTF resignFirstResponder];
    }

    return YES;
}

当我点击清除按钮时,我得到NSLog文本“点击清除按钮”,但键盘不会被解雇。

当我有

时,不知道为什么键盘不会被解雇

编辑1

即使我尝试使用[self.view endEditing:YES];进行如下操作,但仍无效。

- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    if (textField == searchTF) {
        [self.view endEditing:YES];
        [self hideAllKeyboards];
    }
    return YES;
}

3 个答案:

答案 0 :(得分:3)

除了我的评论,我做了一些测试,这是我的结果:

我刚刚使用所有委托方法实现了UITextField

- (BOOL)textFieldShouldClear:(UITextField *)textField {
  NSLog(@"Should Clear");
  [textField resignFirstResponder];
  return YES;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField {
  NSLog(@"Begin editing");
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
  NSLog(@"End editing");
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
  NSLog(@"Should begin editing");
  return YES;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
  NSLog(@"Should end editing");
  return YES;
}

- (BOOL)textField:(UITextField *)textField
    shouldChangeCharactersInRange:(NSRange)range
                replacementString:(NSString *)string {
  NSLog(@"Change char");
  return YES;
}

只要您点击清除按钮,日志就会输出:

2014-07-26 11:08:44.558 Test[36330:60b] Should Clear
2014-07-26 11:08:44.558 Test[36330:60b] Should end editing
2014-07-26 11:08:44.559 Test[36330:60b] End editing
2014-07-26 11:08:44.560 Test[36330:60b] Should begin editing
2014-07-26 11:08:44.561 Test[36330:60b] Begin editing

正如您所看到的那样,shouldBeginEditingdidBeginEditing方法会在清除后被调用,因此resignFirstResponder中的textFieldshouldClear会在新becomeFirstResponder之前被调用由shouldBeginEditingdidBeginEditing调用。

答案 1 :(得分:0)

我不确定问题是什么 但我解决了在使用NSTimer一段时间后调用dismiss键盘方法。

以下是我的所作所为。

- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    if (textField == searchTF) {
        [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(hideAllKeyboards) userInfo:nil repeats:NO];
    }
    return YES;
}

-(void) hideAllKeyboards {
    [searchTF resignFirstResponder];
}

这样,点击清除按钮后,键盘就会被解除。

如果有人发布回答为什么会发生这种情况会很棒。我会将答案标记为已接受。


编辑1

根据丹尼尔的回答,我在下面做了。

- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    if (textField == searchTF) {
        isFilterOn.text = @"no";
        [textField resignFirstResponder];
        textField.text = @"";
        [self myTextFieldDidChange];
    }

    return NO;
}

myTextFieldDidChange中,我根据UITextField中的文字显示已过滤的列表和未过滤的列表。

答案 2 :(得分:0)

我相信您的文本字段IBOutlet已正确连接,尽管您可以尝试

  

[[[UIApplication sharedApplication] keyWindow] endEditing:YES];