我有一个HomeViewController
有不同的模态segue到其他几个UIViewControllers
。如果我尝试在HomeView中显示UITextField
上的键盘,一切都很好。然而,如果我试图显示键盘上的UITextField
(使用becomeFirstResponder
)从任何模态视图控制器返回后,键盘永远不会显示。
下面是我尝试过的一个设置的一些示例代码:
In HomeViewController
:
- (void)viewDidAppear:(BOOL)animated
{
static BOOL firstTimeComplete = false;
if (!firstTimeComplete) {
firstTimeComplete = true;
} else {
UITextField *textField = [[UITextField alloc] init];
[self.view addSubview:textField];
[textField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:3]
}
}
In ModalViewController
:
- (IBAction)done:(id)sender
{
[self dismissViewControllerAnimated:YES completion:nil];
}
其中done:
通过内部事件链接到"完成"按钮。
我尝试过的一些事情:
- 将模态segue转换为push segue解决了这个问题,但是我不希望在任何子视图中都有导航栏
- 我试过禁用和启用动画时解散模态视图控制器(使用
dismissViewControllerAnimated:
) - 在storyboard中使用unwind segue而不是通过编程来完成
有人知道是怎么回事吗?
在删除大量代码后,我终于发现使用了自定义NavigationController,这是根本原因:
@implementation MSLNavigationController
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationPortrait;
}
- (BOOL)shouldAutorotate
{
return NO;
}
@end
应用程序不需要这段代码,所以我删除了文件。(但是解释一下为什么要隐藏键盘会很棒:))
- 您没有呼叫
[super viewDidAppear:animated]
-
在这样的地方,我有一个工作很好的解决方案
- (void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^ { if (self.textView.text.isNotEmpty) { [self.textView becomeFirstResponder]; } }); }
我已经为这个问题挣扎了一段时间,所以我将在这里发布我的发现。
我在viewWillAppear
中调用textField.becomeFirstResponder()
,但在iOS 7中,在模式被驳回后,键盘不会再次显示,即使你点击textField。
对我来说,当模态呈现时调用textField.resignFirstResponder()
,解决了这个问题。似乎输入字段已经被标记为第一响应者,然后不会对新的调用做出反应。