1

我的 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];
}

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

谁能看到我做错了什么?

4

2 回答 2

6

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

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

我建议tempTextField在尝试之前删除。

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

希望这可以帮助

更新

根据苹果的文档disablesAutomaticKeyboardDismissal

此方法的默认实现在视图控制器的模态呈现样式设置为 UIModalPresentationFormSheet 时返回 YES,而对于其他呈现样式返回 NO。因此,系统通常不允许为模态表单关闭键盘。

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

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}
于 2013-08-17T00:19:59.037 回答
1

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

[tableView endEditing:YES];
于 2013-08-16T23:45:52.710 回答