从tableviewcell内的textfield中解除iPad上的键盘

1 keyboard uitableview uipopovercontroller ios

我的iOS键盘有问题.我在UITableViewCell中有一个UITextField.当在同一个TableView中点击另一个TableViewCell时,我想在显示UIPopoverController之前解除键盘.所有这些都显示在表单中.

这是视图层次结构:

  • 根视图控制器
    • UINavigationController,显示为 UIModalPresentationFormSheet
      • 表视图控制器
        • 表格查看单元格1
          • 文本域
        • 表格查看单元格2
          • 点击时: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];
}
Run Code Online (Sandbox Code Playgroud)

正如你可以从代码中看到的,我打过电话resignFirstResponder,并endEditing和我试图创建一个临时的文本字段.我也尝试过实现disablesAutomaticKeyboardDismissal,但从未调用过.

谁能看到我做错了什么?

KDa*_*ker 6

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

尝试这个答案来解雇当前的第一响应者.但是,如果这确实有效,我建议您在直接引用它时仍然会研究为什么它不会被解雇的问题.

我会建议tempTextField在尝试之前删除.

我链接的答案是有用的,你可以使用它,但它更适合你有几个TextFields并且你不一定知道哪个是第一个响应者.

希望这可以帮助

更新

根据苹果的文档disablesAutomaticKeyboardDismissal:

当视图控制器的模式表示样式设置为UIModalPresentationFormSheet并且其他表示样式返回NO时,此方法的默认实现返回YES.因此,系统通常不允许键盘被解雇用于模态形式.

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

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}
Run Code Online (Sandbox Code Playgroud)