【问题标题】:iOS: Close keyboard when UITextField loses focusiOS:当 UITextField 失去焦点时关闭键盘
【发布时间】:2016-09-23 16:53:00
【问题描述】:

如何识别在打开和关闭键盘时单击了其他视图。另一个视图可以在父控制器或屏幕上显示的其他控制器中。

【问题讨论】:

  • 当另一个控制器出现在视图上时,父控制器调用 endediting 在视图上的 viewdiddisappear 怎么样

标签: ios cocoa-touch uitextfield


【解决方案1】:

因为在您的情况下,您可能会在屏幕上显示不止一个 viewController,因此处理此问题的最佳方法是使用 Notification Pattern 通知当前的Observer(customView 或 ViewControler)它的textField/textView(即当前的firstResponder,即键盘显示)应该resignFirstResponder(并关闭键盘)。

注册以观察(TextField 或 TextView)上 BeginEditing 中的任何 DismissKeyboardNeededNotification:

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyboard) name:DismissKeyboardNeededNotification object:nil];
    return YES;
}

在 EndEditing 中移除观察者到通知(DismissKeyboardNeededNotification)

-(void)textFieldDidEndEditing:(UITextField *)textField{

    [self.textField resignFirstResponder];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:DismissKeyboardNeededNotification object:nil];

}

如果当前 ViewController 收到通知,那么它只需要求文本字段 resignFirstResponder 以解除键盘

-(void)dismissKeyboard{

    [self.textField resignFirstResponder]; 
    //or if you have many textField/TextView find it resignFirstResponder
    //[self.textView1 isFirstResponder] then resignFirstResponder
}

当视图被录制/选择时(UITextView 或 UITextView 除外)从任何 viewController 只需发布通知以要求在需要时关闭键盘,如果当前显示键盘,则您的一个 ViewController 正在观察该通知并将处理.

[[NSNotificationCenter defaultCenter] postNotificationName:DismissKeyboardNeededNotification object:nil userInfo:nil];

注意:所有 VC 都可以访问此公共字符串:

 NSString* DismissKeyboardNeededNotification = @"DismissKeyboardNeededNotification";

【讨论】:

    【解决方案2】:

    尝试在 viewController 的主视图上设置点击手势识别器。当它被点击时调用view.endEditing(true)

    如果您有其他手势识别器并且不想干扰它们,请尝试设置点击识别器,创建对其的引用(如果在情节提要中进行),然后在 textFieldDidBeginEditing 中将识别器设置为启用,并在textFieldDidEndEditing 中将其设置为禁用。

    代码 sn-p 仅出于善意:

    class FakeViewController: UIViewController, UITextFieldDelegate {
    
        private let viewTappedGestureRecognizer = UITapGestureRecognizer()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            setupGestureRecognizer()
        }
    
        private func setupGestureRecognizer() {
            viewTappedGestureRecognizer.addTarget(self, action: #selector(viewWasTapped))
            view.addGestureRecognizer(viewTappedGestureRecognizer)
        }
    
        func viewWasTapped(sender: UITapGestureRecognizer) {
            view.endEditing(true)
        }
    
    
        // MARK: - TextField Delegate
    
        func textFieldDidBeginEditing(textField: UITextField) {
            viewTappedGestureRecognizer.enabled = true
        }
    
        func textFieldDidEndEditing(textField: UITextField) {
            viewTappedGestureRecognizer.enabled = false
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 2011-05-25
      相关资源
      最近更新 更多