iOS 7:离开模态ViewController后键盘不显示



我有一个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

应用程序不需要这段代码,所以我删除了文件。(但是解释一下为什么要隐藏键盘会很棒:))

  1. 您没有呼叫[super viewDidAppear:animated]
  2. 在这样的地方,我有一个工作很好的解决方案

    - (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(),解决了这个问题。似乎输入字段已经被标记为第一响应者,然后不会对新的调用做出反应。

最新更新