UITextField在resignFirstResponder上的奇怪行为



已经是第二天了,还是想不出问题,

我有UITabelView与自定义UICellViews,每个自定义UICellViewUILabelUITextField组成。

自定义UICellView对象在其init方法中分配UITextFieldUILabel,并在dealloc中释放。

UITableView中自定义UICellViews的个数为6。

用户场景如下

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

在我的UIViewController类中实现UITextFieldDelegate协议,并设置每个UITextField的委托为self。

我的委托方法如下

- (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];
}

所有的功能都是正确的!

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

p。类似的代码可以在iPhone上运行,但是这个问题在iPad上仍然存在。

您需要知道最后使用的是哪个文本字段!输入[lastUsedTextField resignFirstResponder]

有一个肮脏但有效的技巧…你可以让你的文本字段成为新的活动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
    }
}

是否为textField设置了action ?

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

最新更新