我的iOS键盘有问题。我在UITableViewCell中有一个UITextField。当在同一个TableView中点击另一个TableViewCell时,我想在显示UIPopoverController之前解除键盘。所有这些都显示在表单中。
以下是视图层次结构:
UINavigationController
,显示为UIModalPresentationFormSheet
UIPopoverController
包含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
,但它从未被调用过。
谁能看到我做错了什么?
答案 0 :(得分:6)
[nameTextField resignFirstResponder]
就足够了。可能是IBOutlet没有正确绑定,或者还有其他东西是第一响应者。
尝试this answer解雇当前的第一响应者。但是,如果这确实有效,我建议您在直接引用它时仍然会研究为什么它不会被解雇的问题。
我建议在尝试之前删除tempTextField
。
我链接的答案很有帮助,您可以使用它,但如果您有多个TextFields并且您不一定知道哪个是第一个响应者,则更合适。
希望这会有所帮助
<强>更新强>
根据disablesAutomaticKeyboardDismissal
的{{1}}:
此方法的默认实现在模态时返回YES 视图控制器的表示样式设置为 UIModalPresentationFormSheet并为其他演示文稿返回NO 样式。因此,系统通常不允许键盘 以模态形式被驳回。
所以只需在控制器中覆盖它并返回NO
- (BOOL)disablesAutomaticKeyboardDismissal {
return NO;
}
答案 1 :(得分:1)
请勿创建随机新视图以尝试强制键盘。 UIView
已经提供了一项功能。尝试:
[tableView endEditing:YES];