【问题标题】:Modal Dialog Does Not Dismiss Keyboard模态对话框不会关闭键盘
【发布时间】:2011-03-02 11:22:04
【问题描述】:

我遇到了一个问题,当将UITextFieldUITextView 留在UIModalPresentationFormSheet 中时,键盘不会被关闭。此外,我创建了一个大按钮作为视图的背景,因此如果用户在字段之外点击它就会被触发。我在常规视图控制器中使用相同的代码,它按预期工作。在模态视图控制器中它什么也不做。任何建议将不胜感激。

- (BOOL)textFieldShouldReturn:(id)sender {  
 [titleTextField resignFirstResponder];
 return YES;
}

- (BOOL)textViewShouldReturn:(id)sender {  
 [synopsisTextView resignFirstResponder];
 return YES;
}

- (IBAction)textFieldDoneEditing:(id)sender {  
 [sender resignFirstResponder];
} 

- (IBAction)textViewDoneEditing:(id)sender {  
 [sender resignFirstResponder];
} 

- (IBAction)backgroundClick:(id)sender {  
 [titleTextField resignFirstResponder];
 [synopsisTextView resignFirstResponder];
}

【问题讨论】:

标签: ios ipad uimodalpresentationformsh


【解决方案1】:

覆盖disablesAutomaticKeyboardDismissal 以返回 NO 如下解决了我的相同问题。你应该把这段代码放到你的视图控制器中,从那里你可以启动键盘:

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}

另外,如果您想获得详细解释,请查看此SO 问题。

【讨论】:

  • 它有效,谢谢!这太棘手了。我怎么能自己解决这个问题?啊!!
  • 我认为您应该将代码放到作为模态视图控制器呈现的视图控制器中。如果您以模态方式呈现 UINavigationController(在堆栈上带有视图控制器),您应该将其子类化并覆盖那里的方法。
  • 看起来它应该可以工作,但它没有。我把它放在调出 kbd 的 viewController 和前一个和下一个中,但键盘仍然存在。我从 viewWillDisappear 上的正确 textField 中将其关闭,然后它被调用..
  • 这对我来说无数次在我的 ViewController 中使用它都失败了,但我继续添加了 NavigationController 子类并成功了!
  • 如果您的模态视图控制器位于 UINavigationController 中,请尝试通过在 UINavigationController 上创建一个类别以在其 topViewController 上调用 disablesAutomaticKeyboardDismissal 提出的答案@ctrahey
【解决方案2】:

对于那些在UINavigationController 上遇到问题的人,我认为有比UIViewController 上的类别更好的解决方案。我们应该改变UINavigationController 的行为来询问它的topViewController(在我看来,这是所有ViewController 容器应该处理的方式)。

@implementation UINavigationController (DelegateAutomaticDismissKeyboard)
- (BOOL)disablesAutomaticKeyboardDismissal {
    return [self.topViewController disablesAutomaticKeyboardDismissal];
}

【讨论】:

  • 好建议,让我省了很多苦头!
  • 我们真的应该在一个类别中覆盖方法吗?似乎不对。
  • 为了帮助像我这样的新手,只需继承 UINavigationController 并添加一个方法 - (BOOL)disablesAutomaticKeyboardDismissal { return [self.topViewController disablesAutomaticKeyboardDismissal]; }
  • 这真的应该作为一个子类来完成。我是类别的忠实粉丝,但压倒一切的方法是他们永远不应该使用的一件事! stackoverflow.com/questions/5272451/…
  • @RembrandtQ.Einstein 这是一个很好的观点,但有时很容易过度小心。使用类别的警告是在您知道具有实现的类上覆盖方法时(即,不仅仅是它的祖先之一)。现在,在 Apple 提供的任何类上执行此操作确实存在固有风险,因为您无法保证未来的 SDK 更改。但是,这里使用类别而不是子类的价值非常重要:您现在甚至可以将这种行为用于您没有控制其实例化的导航控制器。不过,这是一个很大的问题。
【解决方案3】:

如果您使用演示样式“表单”呈现模态视图,Apple 显然不会关闭键盘,认为他们不希望键盘在用户会做很多事情的地方跳进跳出编辑(即“表格”)。解决方法是改变演示风格或接受它。

【讨论】:

  • 是的。我正在使用 UIModalPresentationFormSheet。感谢您提供的信息。
  • 在这里很烦人,要从 ModalVC 中平滑淡出,您需要先为键盘设置动画。 stackoverflow.com/questions/2898353/…
  • 见上面@ctrahey 的回答,向 UINavigationController 添加一个类别。为我解决了。
【解决方案4】:

如果您实现了 UITextFieldDelegate 协议,则在进行文本验证时可能会无意中导致此行为。如果您的验证代码在文本无效时从 textFieldShouldEndEditing 返回 false,则该字段无法放弃其 firstResponder 状态,并且键盘将在下一个视图中保留在屏幕上。

更多详情UITextField's keyboard won't dismiss. No, really

【讨论】:

    【解决方案5】:

    我通过调整 UIModalPresentationPageSheet 的大小解决了这个问题。看我的回答here

    【讨论】:

      【解决方案6】:

      disablesAutomaticKeyboardDismissal 拒绝在 iOS 7 上为我工作。

      但是...我设法通过简单地禁用屏幕上的 UITextFields 解决了这个问题。

      我的解决方案描述为here

      此解决方法甚至适用于模态 UIViewControllers。

      是的……这也让我感到惊讶!!

      【讨论】:

        【解决方案7】:

        我也面临同样的问题,也做了所有事情,但没有成功,然后我开始思考并得到一些结果。

        但对于那些想要在文本字段单击然后打开弹出窗口时关闭键盘的人来说,这个答案。

        所以你只需要调用文本字段委托

        func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
            if textField == self.myTxtFieldName{
                self.view.endEditing(true) // keyboard hide code
                // here you can call your model or pop up code and keyboard will dismiss and your pop up open 
                return false 
            } 
             return true
        } 
        

        抱歉,如果这不适合您 如果有其他答案,请编辑它 谢谢

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-22
          • 2016-02-25
          • 1970-01-01
          相关资源
          最近更新 更多