【问题标题】:resignFirstResponder keyboard will NOT go away before segueresignFirstResponder 键盘不会在 segue 之前消失
【发布时间】:2013-10-25 17:00:23
【问题描述】:

我很困惑,希望有人能提供帮助。

我在 segue 之前为我的所有五个文本字段调用 resign first responder 方法。发生转场,如果键盘在转场之前可见,则无论我做什么,键盘都会保留。这在 IOS6 中没有发生。它只发生在 IOS7 中。

非常感谢您的帮助。

场景如下:

用户一次触摸一个文本字段来输入数据。键盘从第一响应者从一个字段更改为下一个字段没有问题,并且可以从 DONE 按钮退出而不会出现问题。当用户触摸将从选取器视图中填充的字段时,就会出现问题。如果键盘在之前的文本字段之一中可见,则它不会消失。

我有这段代码试图在两个字段的editingDidBegin 操作上resignFirstResponder。我正在使用这两个字段来保存数字,但我正在从下一个视图的选择器中填充它们。

- (IBAction)txtRatioOrHullTypeTouched:(id)sender 
{    
    // Hide the keyboard before the segue to the picker occurs.
    [self.txtPitch resignFirstResponder];
    [self.txtRPM resignFirstResponder];
    [self.txtSlipOrSpeed resignFirstResponder];
    [self.txtRatio resignFirstResponder];
    [self.txtHullType resignFirstResponder];

    segueToPicker = YES; // Raise flag indicating that this segue is to the picker.
    [self performSegueWithIdentifier:@"toPicker" sender:sender];
}

我也将同样的代码放在viewWillDisappear 中,如下所示:

- (void)viewWillDisappear:(BOOL)animated // Unchanged
{
    // Hide the keyboard before the segue to the picker occurs.
    [self.txtPitch resignFirstResponder];
    [self.txtRPM resignFirstResponder];
    [self.txtSlipOrSpeed resignFirstResponder];
    [self.txtRatio resignFirstResponder];
    [self.txtHullType resignFirstResponder];

    [super viewWillDisappear:animated];
}

这两种方法都在初始视图 ViewController.m 文件中。

【问题讨论】:

  • 试试 [[[UIApplication sharedApplication] keyWindow] endEditing:YES];

标签: ios iphone objective-c


【解决方案1】:

我最终在这里删除了导致问题的文本字段并用按钮替换它们。我尝试过(几十个)没有一个场景可以让这段代码在 IOS7 中按预期工作,即使它在 IOS6 中都能完美运行。

【讨论】:

  • 你是英雄@zaheer。
【解决方案2】:

我尝试了以上所有方法,只要我用按钮关闭控制器,它就可以工作。按下按钮时调用的函数可以调用TextField的resignFirstResponder()函数,一切正常。

但是,当执行边缘滑动以关闭控制器时,下次我显示它时键盘会不断弹出。在我的代码中,我在视图之间重用相同的控制器。这可能不明智,但它很活泼!

在尝试了互联网所写的所有内容(不是真的,但非常接近)之后,我发现我可以实现 TextField 的 textViewShouldBeginEditing() 并在 ViewControllers ViewDidDisappear 和 ViewDidAppear 之间返回 false。这很简单,但是当没有其他方法起作用时,它就成功了。

希望对大家有帮助!

Swift 代码:

在我的 ViewController 中

override func viewDidAppear(animated: Bool) {
  super.viewDidAppear(animated)
  myTextField.allowEdit = true
}

override func viewDidDisappear(animated: Bool) {
  super.viewDidDisappear(animated)
  myTextField.allowEdit = false
}

在我的 TextField 类中

class MyTextField: UIView, UITextFieldDelegate {
  var allowEdit = true

  func textFieldShouldBeginEditing(textView: UITextView) -> Bool {
    return allowEdit
  }
}

【讨论】:

    【解决方案3】:

    您可以使用文本字段在视图控制器上调用endEditing:。您的 viewWillDisappear: 方法将如下所示:

    - (void)viewWillDisappear:(BOOL)animated 
    {
        [self.view endEditing:YES];
    
        [super viewWillDisappear:animated];
    }
    

    【讨论】:

    • 您是否尝试过将 segue 延迟几百毫秒以使键盘有机会进行动画处理?
    • 是的,我用 SLEEP 命令尝试了整整一秒钟,键盘仍然存在。
    • 好的,这是我通过进一步调查发现的:使用 isFirstResponder 方法,我可以看到第一响应者确实从其他 3 个文本字段中的任何一个更改打开它,到调用 segue 的那个。
    • 所以现在看来​​控制键盘的文本字段不允许辞职。我对该字段使用了 canResignFirstResponder 查询,结果(布尔值)为 FALSE。我还注意到,即使在调用 resignFirstResponder 之后,我也会在字段中看到一个闪烁的光标。
    【解决方案4】:

    贡献我的 2 美分价值。在 iOS 9.2 上正确关闭键盘,一个极简示例,仅供参考。

    ...
    @property (assign) BOOL isTransitioning;
    ...
    
    -(void)viewWillAppear:(BOOL) animated {
        self.isTransitioning = YES;
    }
    -(void)viewWillDisappear:(BOOL) animated {
        self.isTransitioning = YES;
    }
    
    -(void)viewDidAppear:(BOOL) animated {
        self.isTransitioning = NO;
    }
    -(void)viewDidDisappear:(BOOL) animated {
        self.isTransitioning = NO;
    }
    
    -(BOOL) textViewShouldBeginEditing:(UITextView*) tv {
      if (self.isTransitioning) {
       return NO;
      } 
    return YES;
    }
    

    【讨论】:

      【解决方案5】:

      我认为由于您通过选择器离开视图的方式,而不通过退出,您需要在 viewController 中包含以下内容:

      - (BOOL) disablesAutomaticKeyboardDismissal
      {
            return NO;
      }
      

      斯威夫特,2017 年

      override var disablesAutomaticKeyboardDismissal: Bool {
          get { return false }
          set { }
      }
      

      【讨论】:

        【解决方案6】:

        所以现在看来​​,控制键盘的文本字段不允许辞职。我在该字段上使用了 canResignFirstResponder 查询,结果(布尔值)为 FALSE。我还注意到,即使在调用 resignFirstResponder 之后,我也会在字段中看到一个闪烁的光标。 – 拉里 J 2013 年 10 月 25 日 23:32

        我知道这是旧的,但我有一个类似的问题,并想分享对我有用的东西,以防它可以帮助其他人:

        阅读上述评论后,我发现将 [self.view endEditing:YES] 从我在 textFieldDidBeginEditing 中的位置移动到 textFieldSHOULDBeginEditing 对我有用。现在键盘在我的转场之前正确地关闭了。

        【讨论】:

          【解决方案7】:

          将 Zaheer 的评论带入 Swift 这对我来说非常有效。

           view.endEditing(true)
          

          【讨论】:

            【解决方案8】:

            这是我经常遇到的问题。我最好的应对方法是在键盘下创建一个清晰的按钮,然后调用一个解除助手。通过切换其 isHidden 属性来控制清除按钮。在键盘外点击会点击清除按钮并调用解除助手。它不会触发您的转场,用户需要再次点击才能导航出去,但该键盘将消失。

            在 viewDidLoad() 中:

                var clearButton: UIButton!
                self.clearButton = UIButton(frame: self.view.frame)
                self.clearButton.backgroundColor = .clear
                self.clearButton.addTarget(self, action: #selector(self.dismissHelper(_:)), for: .touchUpInside)
                self.view.addSubview(self.clearButton)
                self.clearButton.isHidden = true
            

            然后添加dismiss helper:

            func dismissHelper(_ sender: UIButton?) {
                self.clearButton.isHidden = true
                view.endEditing(true)
            }
            
            
            func displayClearButton(){
                print("display clear button, hidden = false")
                self.clearButton.isHidden = false
            }
            

            然后在您的文本字段中添加目标

            self.textField.addTarget(self, action: #selector(self.displayClearButton), for: .editingDidBegin)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-03-21
              • 1970-01-01
              • 2017-10-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多