iOS - 如何关闭键盘?

3
在我的应用程序中,我按下一个按钮,它会弹出一个模态演示表单(适用于iPad)。在这个模态视图中,我有一个滚动视图和一个文本框。滚动视图位于主视图中。
view controller
    view
        scrollview
            text field

我尝试的所有方法都没有使键盘消失,也不知道原因。唯一发生的事情就是文本字段中闪烁的光标消失了。我的类是滚动视图和文本字段的代理。以下是我尝试过的方法:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    [self.titleTextField resignFirstResponder];
    [self.titleTextField endEditing:YES];
    [self.view endEditing:YES];
    [self.view resignFirstResponder];
    [self.scrollView endEditing:YES];
    [self.scrollView resignFirstResponder];
}

该方法确实被调用,但键盘不会自动消失。有人可以帮我或者至少告诉我为什么吗?

以下是我展示该modalpresentation视图的方式:

(它来自一个tableviewcontroller)

didSelectRowAtIndexPath

EditVideo *targetController = [self.storyboard instantiateViewControllerWithIdentifier:@"editVideo"];

        targetController.delegate = self;

        UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:targetController];

        navigationController.modalPresentationStyle = UIModalPresentationFormSheet;

        [self presentViewController:navigationController animated:YES completion:nil];

        [self.tableView deselectRowAtIndexPath:indexPath animated:YES];

我的猜想是你的titleTextField要么不是第一响应者,要么在代码中的其他地方再次创建了它。 在这里也看一下:https://dev59.com/23I-5IYBdhLWcg3wf4dD#1823360 - Lefteris
你确认你是第一响应者了吗?尝试使用Steve的gewtfirstresponder代码来获取UIView的第一响应者:https://dev59.com/qV_Va4cB1Zd3GeqPPQcL。此外,scrollViewDidScroll在滚动后是否会被调用,并且您可能已经将焦点放回到滚动视图并重新初始化了第一响应者? - Aardvark
当我尝试查找第一响应者时,它返回null。 - Josue Espinosa
然而,当我检查 [self.titleTextField isFirstResponder] 时,它返回1(真)。 - Josue Espinosa
1个回答

4

对于iPad上的任何非全屏ViewController,您必须实现-(BOOL)disablesAutomaticKeyboardDismissal方法并返回NO以关闭键盘。

- (BOOL)disablesAutomaticKeyboardDismissal
{
    return NO;
}

一旦实现了这个,你就可以调用[self.view endEditing:YES];来完成操作。
编辑: 另一个常见的问题是从- (BOOL)textFieldShouldEndEditing:(UITextField *)textField返回NO。在UITextFieldDelegate中实现此方法,并始终无条件地返回YES以证明它不是原因。

@JosueEspinosa:你在呈现的视图控制器和被呈现的(表单表格)视图控制器中都实现了吗? - Holly
我更新了我的答案,现在包括我遇到的这个问题的两个原因。你可能在你的代码中有一个错误。发布你的视图控制器代码,这样我们就可以检查它。 - Holly
更新了我的问题。顺便说一下,文本字段并不是通过编程方式创建的,而是通过界面构建器创建的。我没有在任何类中以任何方式修改文本字段。 - Josue Espinosa
请确认,在您的 EditVideo 视图控制器中,您是否正在实现 -disablesAutomaticKeyboardDismissal 方法? - Holly
我的意图是在用户滚动滚动视图时隐藏键盘。 - Josue Espinosa
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接