从 ModalViewController 返回后没有出现键盘

Posted

技术标签:

【中文标题】从 ModalViewController 返回后没有出现键盘【英文标题】:keyboard not appearing after return from ModalViewController 【发布时间】:2014-02-10 16:10:42 【问题描述】:

我有一个 UIViewController 然后我用这段代码展示了一个模式视图控制器来输入密码。

[self performSegueWithIdentifier:@"SeguePassword" sender:self];

在故事板中:

故事板转场 标识符 = SeguePassword 样式=模态 过渡 = 默认 动画 = 未选中

当我在具有以下代码的模式上单击“取消”时:

[self dismissViewControllerAnimated:NO completion:^];

现在当我回来时,键盘被隐藏了。我有代码来显示一个带有隐藏按钮的工具栏。我看到了,但没有看到键盘。

是否有人对解决此类问题有任何想法或指示?它似乎是在为 ios 7 转换更改后最近开始的。

我的解决方案:

我发现这个是因为在我沮丧地点击了几次警告框后,我看到键盘的方向错误。即,当应用仅在 iPhone 上为纵向时,横向键盘。

之前:

- (NSUInteger) supportedInterfaceOrientations 
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight;
 else 
    **return (UIInterfaceOrientationPortrait);**

之后:

- (NSUInteger) supportedInterfaceOrientations 
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight;
 else 
    **return (UIInterfaceOrientationMaskPortrait);**

我将 Portrait 更改为使用 Mask 整数,然后一切又开始工作了。

【问题讨论】:

你用过UIKeyboardWillShow/HideNotification吗? 我使用 textBegingEdit 协议,它第一次在登录页面上运行良好,它们的键盘也显示在模式密码窗口上。但是当我解除密码时,尽管键盘上的附加工具栏出现了,但键盘不再出现。如果我通过在笔记本电脑键盘上输入登录并注销它再次正常工作。 UIInterfaceOrientationPortrait 更改为UIInterfaceOrientationMaskPortrait 也为我解决了这个问题。 【参考方案1】:

只有当某个对象是 firstResponder 时,键盘才可见。查看 UIResponder 类的文档。

如果您的模态视图控制器使用键盘,听起来确实如此,它会获取第一响应者状态,并且原始屏幕上的任何内容都会丢失它。如果您想从模态视图控制器返回到相同的状态,并且某些对象具有输入焦点(即成为 firstResponder),并且键盘可见,您将必须编写代码才能实现这一点。特别是,您的原始视图控制器必须知道模态视图控制器何时终止,以便它可以使您的输入对象、textField 或 textView 或其他任何内容成为该语句的第一响应者:

   [objectIWantToBeFirstResponder becomeFirstResponder];

现在您如何知道模态视图控制器何时完成? 有几个明显的技巧。

如果你想使用 segue,那么模态视图控制器将不得不 明确地让呈现视图控制器知道它是 终止。您可能希望在 模态视图控制器并让呈现视图控制器采用 它。当模态视图控制器想要退出时,它首先告诉呈现 视图控制器。

由于您可能是手动触发 segue 您愿意在代码中呈现模态视图控制器。如果是的话 你可以使用完成块:

   ModalViewControllerClass *vc = [[ModalViewControllerClass alloc] init];
   // whatever else you need to do to the vc
    [self presentViewController:vc animated:YESorNO completion:^
        // This code gets executed when the presented view controller exits
        [objectIWantToBeFirstResponder becomeFirstResponder];
    ];

【讨论】:

感谢您花时间回答这个问题。这不起作用,但我正在分析代码以找到一个漏洞。 好的,所以当我回到原始视图时,我尝试在 viewDidAppear 中调用 [self becomeFirstResponder],因为我不希望键盘显示在他们点击文本框的下方。即使键盘没有显示,我点击登录时使用空白 id 并且 UIAlertBox 显示,然后在横向视图中显示键盘的一半,而对于 iPhone 版本,我始终处于纵向。 实际原因是因为我支持的接口方法,我恢复到我的segue。一切都很好。因为你在回答方面做得很好,从技术上讲,它回答了我的要求,所以我给了你答案。请参阅我的答案以查看我为解决问题而替换的代码。

以上是关于从 ModalViewController 返回后没有出现键盘的主要内容,如果未能解决你的问题,请参考以下文章

从后台恢复显示 ModalViewController,避免下面的内容闪烁

如何在另一个 modalViewController 退出后更新 modalViewController

从 ModalViewController 更新 splitViewController

如何从 modalViewController 推送 ViewController

从 UISplitViewController 呈现的 modalViewController 出现方向错误

modalViewController 从 superview 中移除后 UIView 消失