从 uitableviewcell 内的文本字段中关闭 iPad 上的键盘

Posted

技术标签:

【中文标题】从 uitableviewcell 内的文本字段中关闭 iPad 上的键盘【英文标题】:Dismissing keyboard on iPad from textfield inside tableviewcell 【发布时间】:2013-08-16 23:41:23 【问题描述】:

我的 ios 键盘有问题。我在 UITableViewCell 中有一个 UITextField。在同一个 TableView 中点击另一个 TableViewCell 时,我想在显示 UIPopoverController 之前关闭键盘。所有这些都显示在表格中。

这是视图层次结构:

根视图控制器 UINavigationController,显示为UIModalPresentationFormSheet 表视图控制器 表格视图单元格 1 文本字段 表格视图单元格 2 点击时:@9​​87654323@ 包含 UIDatePicker

在此图中,我想在 tableView:didSelectRowAtIndexPath: 中添加代码以在显示 UIPopoverController 之前关闭键盘。这在 iPhone 上不是问题,因为我使用的是全屏模式视图控制器而不是弹出框控制器。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    // nameTextField is the text field in Table View Cell 1
    [nameTextField resignFirstResponder];

    UITextField *tempTextField = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 100, 10)];
    [self.view addSubview:tempTextField];
    [self.view setNeedsDisplay];
    tempTextField.enabled = NO;
    [tempTextField becomeFirstResponder];
    [tempTextField resignFirstResponder];
    [tempTextField removeFromSuperview];

    [self.view endEditing:YES];

    KDDatePickerViewController *dpvc = [[KDDatePickerViewController alloc] init];
    popoverController = [[UIPopoverController alloc] initWithContentViewController:dpvc];
    [popoverController presentPopoverFromRect:[self.tableView cellForRowAtIndexPath:indexPath].frame
                                       inView:self.view
                     permittedArrowDirections:UIPopoverArrowDirectionAny
                                     animated:YES];

从代码中可以看出,我尝试调用resignFirstResponderendEditing,并尝试创建一个临时文本字段。 我也尝试过实现disablesAutomaticKeyboardDismissal,但它从未被调用过。

谁能看到我做错了什么?

【问题讨论】:

实际问题是什么?你从不说出了什么问题,只说你已经尝试过。 nameTextField 您在表视图单元格 1 中引用的字段吗?视图中有其他文本字段文本视图吗? @maddy:显示弹出框控制器时键盘不会被关闭。我试图强制文本字段失去焦点,但键盘仍然存在。 @KDaker 对不起,我忘了提。没错,nameTextField 是表格视图单元格 1 中的文本字段。我的表格视图中没有其他文本字段或文本视图。 【参考方案1】:

[nameTextField resignFirstResponder] 应该足够了。可能是 IBOutlet 没有正确绑定,或者有其他东西是第一响应者。

尝试this answer 关闭当前的第一响应者。但是,如果这确实有效,我建议您仍然研究直接引用它时为什么它没有被解雇的问题。

我建议在尝试此操作之前删除 tempTextField

我链接的答案很有帮助,您可以使用它,但在您有多个 TextField 并且您不一定知道哪个是第一响应者的情况下更合适。

希望对你有帮助

更新

根据apple's documentation为disablesAutomaticKeyboardDismissal

该方法的默认实现在modal时返回YES 视图控制器的表示样式设置为 UIModalPresentationFormSheet 并为其他演示文稿返回 NO 样式。因此,系统通常不允许键盘 因模态形式而被解雇。

所以只需在控制器中覆盖它并返回 NO

- (BOOL)disablesAutomaticKeyboardDismissal 
    return NO;

【讨论】:

我注意到在调用[nameTextField resignFirstResponder] 之后,闪烁的光标消失了。所以我认为文本字段实际上失去了焦点,但由于某种原因键盘并没有消失。我还注意到,点击键盘不再将文本插入文本字段。我没有任何其他文本字段。我刚刚尝试了您链接到的断言,但我仍然遇到同样的问题:键盘没有消失,但文本字段似乎失去焦点并且在键盘上键入不再插入文本。 非常感谢!覆盖 disablesAutomaticKeyboardDismissal 解决了我的问题。【参考方案2】:

不要创建随机的新视图来尝试强制使用键盘。 UIView 已经提供了一项功能。试试:

[tableView endEditing:YES];

【讨论】:

我注释掉了我尝试添加临时文本字段的其他代码并插入了[tableView endEditing:YES];,但键盘仍然没有被关闭。 可能是[tableView.window endEditing:YES]; 在这种情况下似乎也不起作用。我注意到,当使用您的任何一种方法或[nameTextField resignFirstResponder]; 时,文本字段中闪烁的光标消失了。所以看起来文本字段不再是第一响应者,但由于某种原因键盘没有消失。

以上是关于从 uitableviewcell 内的文本字段中关闭 iPad 上的键盘的主要内容,如果未能解决你的问题,请参考以下文章

从外部源设置 UITableViewCell 内的内容?

将 UIPickerView 选择设置为 UITableViewCell 内的 UITextField

UITableViewCell 内的 UITextField - 防止文本重置的方法

UITableViewCell 内的 UIStackView 在 AutoLayout 上无法正确调整

动态/可出队的 UITableviewcells 内的 UITextfield

ios从uitableViewCell中的文本字段获取文本值