注意:

关于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];

当前回答

我通过使用UIModalPresentationPageSheet演示样式来解决这个问题,并在我呈现它之后立即调整它的大小。像这样:

viewController.modalPresentationStyle = UIModalPresentationPageSheet;
viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:viewController animated:YES];
viewController.view.superview.autoresizingMask = 
    UIViewAutoresizingFlexibleTopMargin | 
    UIViewAutoresizingFlexibleBottomMargin;    
viewController.view.superview.frame = CGRectMake(
    viewController.view.superview.frame.origin.x,
    viewController.view.superview.frame.origin.y,
    540.0f,
    529.0f
);
viewController.view.superview.center = self.view.center;
[viewController release];

其他回答

可能不返回NO,但返回YES。这样它就可以消失了。

你有一个textFieldShouldEndEditing返回YES,以及?

为什么你要解雇[nextResponder becomeFirstResponder]?!对不起,我现在明白了

我还有一些uitextview 它们都有自己的"可编辑" 属性设置为FALSE。

我们可以假设它们中没有一个标签值为secondField.tag+1吗?如果是这样,你就告诉他们成为第一响应者,而不是辞去第一响应者。也许在if结构中加入一些NSLog()。

在以模态方式呈现的视图控制器中,只需重写disablesautomatickeyboarddismiss以返回NO:

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}

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

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

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

这被苹果工程师归类为“正常工作”。我之前提交了一个漏洞。他们的理由是,用户通常会以模态形式输入数据,所以他们试图“有帮助”,并保持键盘可见,而通常模态视图中的各种转换会导致键盘重复显示/隐藏。

编辑:以下是一位苹果工程师在开发者论坛上的回应:

你的视图是否以UIModalPresentationFormSheet样式呈现?为了避免频繁的输入和输出动画,即使没有第一响应器,键盘有时也会保持在屏幕上。这不是一个bug。

这给很多人带来了问题(包括我自己),但目前似乎没有办法解决这个问题。

更新:

在ios4.3及以后版本中,你现在可以在你的视图控制器上实现' - disablesautomatickeyboardfired '来返回NO:

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}

这就解决了问题。