如果模态ViewController演示文稿样式为UIModalPresentationFormSheet,则iPad键盘不会被忽略

Kal*_*lle 214 iphone objective-c uitextfield first-responder ios

注意:

从iOS 4.3开始,请参阅已接受的答案(不是最受欢迎的答案).

这个问题是关于在iPad键盘中发现的行为,如果在带有导航控制器的模态对话框中显示,它将拒绝被解雇.

基本上,如果我使用以下行显示导航控制器,如下所示:

navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
Run Code Online (Sandbox Code Playgroud)

键盘拒绝被解雇.如果我注释掉这一行,键盘就会消失.

...

我有两个textFields,用户名和密码; username有一个Next按钮,密码有一个Done按钮.如果我在模态导航控制器中显示它,键盘将不会消失.

作品

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
[self.view addSubview:b.view];
Run Code Online (Sandbox Code Playgroud)

什么都不行

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];
Run Code Online (Sandbox Code Playgroud)

如果我删除导航控制器部件并将"b"作为模态视图控制器单独显示,则可以正常工作.导航控制器是问题吗?

作品

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
b.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:b animated:YES];
[b release];
Run Code Online (Sandbox Code Playgroud)

作品

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController = 
    [[UINavigationController alloc]
         initWithRootViewController:b];
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];
Run Code Online (Sandbox Code Playgroud)

Mik*_*ler 172

这被Apple工程师列为"按预定工作".我暂时为此提交了一个错误.他们的理由是用户经常会以模态形式输入数据,因此他们试图"有用"并保持键盘可见,通常模态视图中的各种过渡可能导致键盘重复显示/隐藏.

编辑:这是 Apple工程师在开发人员论坛上的回复:

你的观点是否有机会呈现UIModalPresentationFormSheet风格?为了避免频繁的进出动画,即使没有第一响应者,键盘有时也会保持在屏幕上.这不是一个错误.

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

更新:

在iOS 4.3及更高版本中,您现在可以在视图控制器上实现`-disablesAutomaticKeyboardDismissal'以返回NO:

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

这解决了这个问题.

  • *暂停*哇,好的.非常感谢你的提醒.该死的苹果...... :( (7认同)
  • 我尝试了disablesAutomaticKeyboardDismissal方法,但它仍然没有解决问题,如何解决呢? (5认同)
  • 从iOS 4.3开始,现在有一个disablesAutomaticKeyboardDismissal方法可以解决这个问题. (3认同)
  • @Snips:您需要创建一个`UINavigationController`子类,它覆盖`disablesAutomaticKeyboardDismissal`以返回'NO`,并在您呈现模态表单时将其用作导航控制器.请参阅下面的@ miha-hribar的答案. (3认同)

Mih*_*bar 149

如果要显示带有的模态,请小心UINavigationController.然后,您必须disablesAutomaticKeyboardDismissal在导航控制器上设置,而不是在视图控制器上.您可以使用类别轻松完成此操作.

文件:UINavigationController + KeyboardDismiss.h

#import <Foundation/Foundation.h>

@interface UINavigationController (KeyboardDismiss)

- (BOOL)disablesAutomaticKeyboardDismissal;

@end
Run Code Online (Sandbox Code Playgroud)

文件:UINavigationController + KeyboardDismiss.m

#import "UINavigationController+KeyboardDismiss.h"

@implementation UINavigationController(KeyboardDismiss)

- (BOOL)disablesAutomaticKeyboardDismissal
{
    return NO;
}

@end
Run Code Online (Sandbox Code Playgroud)

不要忘记在使用UINavigationController的文件中导入类别.

  • +1,最后我看到这个问题的缺失部分突出显示:需要覆盖`UINavigationController`的`disablesAutomaticKeyboardDismissal`,而不是自己的视图控制器来解决这个问题. (19认同)
  • 在类别中实现重复方法不是一个好主意.您永远无法确定将调用哪个实现,因此最多可能会出现不一致的行为.最好从UINavigationController继承并覆盖自定义类中的方法. (6认同)

小智 115

在以模态方式呈现的视图控制器中,只需覆盖disablesAutomaticKeyboardDismissal以返回NO:

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

  • 这需要添加到导航控制器 (2认同)

azd*_*dev 51

我通过使用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];
Run Code Online (Sandbox Code Playgroud)

  • toofah,我编辑了代码来处理旋转时收缩/增长的问题; 只是给superview一个灵活的顶部和底部边距.我不确定我是否看到了其他行为. (2认同)