注意:

关于iOS 4.3的解决方案,请参阅已接受的答案(不是投票最多的答案)。

这个问题是关于在iPad键盘上发现的一个行为,如果在导航控制器的模态对话框中显示,它拒绝被驳回。

基本上,如果我用下面这行来显示导航控制器:

navigationController.modalPresentationStyle = UIModalPresentationFormSheet;

键盘拒绝被忽略。如果我注释掉这一行,键盘就会消失。

...

我有两个文本字段,用户名和密码;用户名有一个下一步按钮,密码有一个完成按钮。如果我在模式导航控制器中呈现这个,键盘就不会消失。

作品

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
[self.view addSubview:b.view];

不起作用

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController = 
[[UINavigationController alloc]
 initWithRootViewController:b];
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
navigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];

如果我移除导航控制器部分,并将'b'单独表示为一个模态视图控制器,它可以工作。导航控制器有问题吗?

作品

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
b.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:b animated:YES];
[b release];

作品

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController = 
    [[UINavigationController alloc]
         initWithRootViewController:b];
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];

当前回答

我发现disablesautomatickeyboardfired和添加一个disablesautomatickeyboardfired函数在一个模态对话框中对我的UITextField不起作用。

屏幕键盘就是不会消失。

我的解决方案是禁用对话框中的所有文本输入控件,然后在几秒钟后重新启用相关控件。

似乎当iOS看到没有UITextField控件被启用时,它就会摆脱键盘。

其他回答

我相信你们看过这个,但你们确定控制器类被正确地连接为UITextField委托,对吧?

对于那些使用UINavigationController有问题的人,请参阅我在这里对类似问题的回答: https://stackoverflow.com/a/10507689/321785

编辑: 我认为这是对Miha Hribar的解决方案的改进(因为决策发生在它应该发生的地方),而不是Pascal关于UIViewController上的类别的评论

你也可以在通用的应用程序中通过简单地检查习语来解决这个问题,如果是iPad,完全不要自动弹出键盘,让用户点击他们想要编辑的任何内容。

可能不是最好的解决方案,但它非常简单,不需要任何花哨的黑客,将打破下一个主要的iOS版本:)

把这段代码放在当前控制器的viewWillDisappear:方法中是另一种解决这个问题的方法:

Class UIKeyboardImpl = NSClassFromString(@"UIKeyboardImpl");
id activeInstance = [UIKeyboardImpl performSelector:@selector(activeInstance)];
[activeInstance performSelector:@selector(dismissKeyboard)];

我发现disablesautomatickeyboardfired和添加一个disablesautomatickeyboardfired函数在一个模态对话框中对我的UITextField不起作用。

屏幕键盘就是不会消失。

我的解决方案是禁用对话框中的所有文本输入控件,然后在几秒钟后重新启用相关控件。

似乎当iOS看到没有UITextField控件被启用时,它就会摆脱键盘。