从 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
点击时:@987654323@ 包含 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];
从代码中可以看出,我尝试调用resignFirstResponder
和endEditing
,并尝试创建一个临时文本字段。
我也尝试过实现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 上的键盘的主要内容,如果未能解决你的问题,请参考以下文章
将 UIPickerView 选择设置为 UITableViewCell 内的 UITextField
UITableViewCell 内的 UITextField - 防止文本重置的方法
UITableViewCell 内的 UIStackView 在 AutoLayout 上无法正确调整