resignFirstResponder键盘不会在segue之前消失

时间:2013-10-25 17:00:23

标签: ios iphone objective-c

我很难过,我希望有人可以提供帮助。

我在segue之前调用所有五个文本字段的resign第一响应方法。 segue发生,如果键盘在segue之前可见,键盘仍然无论我做什么。这在IOS6中没有发生。它只发生在IOS7中。

非常感谢您的帮助。

以下是该方案:

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

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

- (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文件中。

8 个答案:

答案 0 :(得分:2)

我最终在这里删除导致问题的文本字段并用按钮替换它们。没有任何情况我试过(几十个)让这个代码在IOS7中按预期工作,即使它在IOS6中都完美无缺。

答案 1 :(得分:2)

我尝试了上述所有内容,只要我用一个按钮取消控制器就可以工作。按下按钮时调用的函数可以调用TextField的resignFirstResponder()函数,一切都很顺利。

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

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

我希望这可以帮助你们!

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
  }
}

答案 2 :(得分:1)

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

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

    [super viewWillDisappear:animated];
}

答案 3 :(得分:1)

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

- (BOOL) disablesAutomaticKeyboardDismissal
{
      return NO;
}

斯威夫特,2017年

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

答案 4 :(得分:1)

贡献我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 :(得分:0)

  

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

我知道这已经过时了,但我遇到了类似的问题,想要分享对我有用的东西,以防它对其他人有所帮助:

在阅读上述评论后,我发现将[self.view endEditing:YES]从我在 textFieldDidBeginEditing 中的位置移动到 textFieldSHOULDBeginEditing 为我做了诀窍。现在键盘在我的segue之前正确地解雇了。

答案 6 :(得分:0)

接受Zaheer对Swift的评论,这对我来说非常有效。

 view.endEditing(true)

答案 7 :(得分:0)

这是我经常遇到的问题。我最好的应对方法是在键盘下方创建一个清除按钮,并让其调用解雇助手。通过切换其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

然后添加解雇助手:

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)