iphone - resignFirstResponder 上的 UITextField 奇怪行为

标签 iphone ios ipad uitextfield

已经是第二天了,还没弄清楚问题,

我有 UITabelView 和自定义 UICellViews,每个自定义 UICellView 都由 UILabelUITextField 组成

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

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

用户场景如下

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

在我的 UIViewController 类中实现 UITextFieldDelegate 协议(protocol),并将每个 UITextField 的委托(delegate)设置为自己。

我的委托(delegate)方法如下

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

所有功能正常!

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

附言。类似代码在 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
    }
}

关于iphone - resignFirstResponder 上的 UITextField 奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8396862/

相关文章:

IOS 电脑键盘输入

ios - iOS9 更新后 AppSettings Kit 奇怪的单元格内容对齐

ios - 如何在我的 iPhone 应用程序中显示我的应用程序的内存使用情况

iphone - 在 iphone 的 UIWebView 中显示选择的自定义菜单

iphone - 如何在暂停后恢复执行选择器方法?

ios - 使用按钮点击在 NSArray 对象上循环

iphone - 为响应触摸事件的旋转轮设置动画的最佳方式

iphone - NSString 编码问题

ios - HTTP Live Streaming iOS 限制

ios - 字符串为 BEGINSWITH 特殊字符的过滤器对象的 NSPredicate