UITextField对resignFirstResponder的奇怪行为

时间:2011-12-06 08:05:05

标签: iphone ios ipad uitextfield

已经是第二天,无法弄清楚问题,

UITabelView使用自定义UICellViews,每个自定义UICellViewUILabelUITextField组成。

自定义UICellView对象在其UITextField方法中分配UILabelinit,并在dealloc中发布。

UICellViews中自定义UITableView的数量为6.

用户场景如下

  • 当用户点击1到5 UITextFields虚拟键盘时,用户输入一些文字
  • 当用户点击第6 UITextField时,如果虚拟键盘处于活动状态,则应该隐藏它,如果它被隐藏,则不会显示。

在我的UITextFieldDelegate课程中实施UIViewController协议,并将每个UITextField的代理设置为自己。

我的委托方法如下

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    if (textField.tag != 6) {
        return YES;
    } else {
        [textField resignFirstResponder];
        return NO;
    }
}

-(BOOL)  textFieldShouldEndEditing:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

-(void) textFieldDidBeginEditing:(UITextField *)textField {
     /* Some code */
}

-(void) textFieldDidEndEditing:(UITextField *)textField
{
    [textField resignFirstResponder];
}

所有功能都正常!

现在,虚拟键盘永远不会被隐藏,为什么会这样?

PS。类似的代码在iPhone上有效,但这个问题存在于iPad上。

2 个答案:

答案 0 :(得分:5)

您需要知道上次使用的是哪个文本字段!所以你可以做[lastUsedTextField resignFirstResponder]

有一个肮脏但有效的技巧..你可以让你的textfield成为新的活动UITextField并立即在下一个周期中调用resignFirstResponder:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    if (textField.tag != 6) {
        return YES;
    } else {
        // this will schedule keyboard dismissal for the current text field
        dispatch_async(dispatch_get_main_queue(), ^{
            [textField resignFirstResponder];
        });
        return YES; // -> make this one active
    }
}

答案 1 :(得分:0)

你是否为textField设置了动作?

[YourTextField addTarget:self action:@selector(textFieldDoneEditing:) forControlEvents:UIControlEventEditingDidEndOnExit];

PS为任何ControlEvent设置任何选择器