注意:
见接受的答案(不是顶部投票之一)解决方案的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