iPad的键盘不会解散,如果模态视图控制器的演讲风格是UIModalPresentationForm

2019-05-11 00:03发布

注意:

见接受的答案(不是顶部投票之一)解决方案的iOS 4.3的。

这个问题是关于在iPad键盘,它拒绝如果显示在导航控制器模式对话框被解雇发现了一个行为。

基本上,如果我呈现导航控制器使用以下行如下:

navigationController.modalPresentationStyle = UIModalPresentationFormSheet;

键盘拒绝被解雇。 如果我注释掉这一行,键盘消失罚款。

...

我有两个文本框,用户名和密码; 用户名拥有Next按钮和密码有一个完成按钮。 如果我提出这样一个模式导航控制器的键盘不会消失。

作品

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

Answer 1:

在有模式呈现的视图控制器,只是重写disablesAutomaticKeyboardDismissal返回NO

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}


Answer 2:

这已被列为“按预期工作”,由苹果工程师。 我提交了错误此而回。 他们的理由是,用户往往会在模态形式来输入数据,因此他们正试图成为“有用”,并保持键盘可见在模式视图中通常的各种转变可能会导致键盘显示/隐藏反复。

编辑: 这里是响应的开发者论坛的苹果工程师:

被提出与UIModalPresentationFormSheet风格的任何机会,你的看法如何? 为了避免频繁入和出动画,键盘有时会在屏幕上保留,即使没有第一响应者。 这是不是一个错误。

这是给很多人的问题(包括我自己),但目前似乎没有要解决它的方法。

更新:

在的iOS 4.3或更高版本,您现在就可以实现'-disablesAutomaticKeyboardDismissal”您的视图控制器返回NO上:

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}

这修复该问题。



Answer 3:

要小心,如果你是显示一个模态UINavigationController 。 然后,您必须设置disablesAutomaticKeyboardDismissal导航控制器上,而不是视图控制器上。 您可以轻松地使用类别做到这一点。

文件:UINavigationController的+ KeyboardDismiss.h

#import <Foundation/Foundation.h>

@interface UINavigationController (KeyboardDismiss)

- (BOOL)disablesAutomaticKeyboardDismissal;

@end

文件:UINavigationController的+ KeyboardDismiss.m

#import "UINavigationController+KeyboardDismiss.h"

@implementation UINavigationController(KeyboardDismiss)

- (BOOL)disablesAutomaticKeyboardDismissal
{
    return NO;
}

@end

不要忘了导入类别中,您使用的UINavigationController的文件中。



Answer 4:

我使用解决了这个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];


Answer 5:

如果您切换不同的模式显示,你可以得到键盘消失。 这不是漂亮,它没有动画了,但你可以得到它去了。

这将会是巨大的,如果有一个修复,但现在这个工程。 您可以在一个类别楔它UIViewController并调用它,当你想要的键盘了:

@interface _TempUIVC : UIViewController
@end

@implementation _TempUIVC
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}
@end

@implementation UIViewController (Helpers)

- (void)_dismissModalViewController {
    [self dismissModalViewControllerAnimated:NO];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil];
    [self release];
}

- (void)forceKeyboardDismissUsingModalToggle:(BOOL)animated {
    [self retain];
    _TempUIVC *tuivc = [[_TempUIVC alloc] init];
    tuivc.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentModalViewController:tuivc animated:animated];
    if (animated) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_dismissModalViewController) name:UIKeyboardDidHideNotification object:nil];
    } else
        [self _dismissModalViewController];
    [tuivc release];
}

@end

小心这虽然为你viewDidAppear / viewDidDisappear,所有这些方法被调用。 就像我说的,这不是很漂亮,但没有工作。

-亚当



Answer 6:

你也可以解决这个在通用的应用程序只需勾选成语,如果它是一台iPad,不弹出键盘自动在所有并让他们想要编辑的用户点击。

也许不是最好的解决办法,但它是非常简单,不需要任何花哨的黑客,将与下一个主要版本的iOS破解:)



Answer 7:

对于那些具有UINavigationController的麻烦,看我的回答类似的问题在这里: https://stackoverflow.com/a/10507689/321785

编辑:我认为这是一个改进,米哈Hribar的解决方案(既然决定走地方,它应该),以及相对于帕斯卡尔的评论关于对UIViewController的一个类别



Answer 8:

把这个代码在您的viewWillDisappear:电流控制器的方法是另一种方式来解决这个问题:

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


Answer 9:

我敢肯定你已经看过,但你确信你的控制器类是正确挂接为代表的UITextField,对不对?



Answer 10:

也许不返回NO,但YES。 因此,它可以走。

和你有一个textFieldShouldEndEditing返回YES呢?

而你为什么射击[nextResponder becomeFirstResponder] 对不起,我现在看到

我也有一些UITextViews的它们都具有自己的“编辑”属性设置为FALSE。

我们可以假设他们没有通过任何机会,有tag的值secondField.tag+1 ? 如果是这样,你告诉他们,成为第一个响应者,而不是辞职第一响应者。 也许把一些的NSLog()中,如果结构。



Answer 11:

可能不是一个完美的解决方案,但作品
[self.view endEditing:YES];
在任何地方你的按钮或手势实现呈现模式



Answer 12:

我发现, disablesAutomaticKeyboardDismissal并添加disablesAutomaticKeyboardDismissal功能并没有对我的工作UITextField在一个模式对话框。

屏幕键盘只是不会消失。

我的解决办法是禁用所有文本输入控件在我的对话框,然后再重新启用相关的多个一秒钟的一小部分。

它好像iOS版时看到,没有任何的UITextField控制有效,则摆脱了键盘。



Answer 13:

Swift 4.1:
extension UINavigationController {
   override open var disablesAutomaticKeyboardDismissal: Bool {
      return false
   }
}


文章来源: iPad keyboard will not dismiss if modal ViewController presentation style is UIModalPresentationFormSheet