4

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

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

非常感谢您的帮助。

这是场景:

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

我有这段代码试图对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 文件中。

4

8 回答 8

2

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

于 2013-10-29T21:09:57.140 回答
2

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

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

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

我希望这对你们有帮助!

SWIFT代码:

在我的视图控制器中

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
  }
}
于 2015-11-24T19:37:43.467 回答
1

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

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

    [super viewWillDisappear:animated];
}
于 2013-10-25T17:39:31.620 回答
1

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

- (BOOL) disablesAutomaticKeyboardDismissal
{
      return NO;
}

斯威夫特,2017

override var disablesAutomaticKeyboardDismissal: Bool {
    get { return false }
    set { }
}
于 2013-10-29T21:40:49.417 回答
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;
}
于 2016-01-06T03:08:36.670 回答
0

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

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

在阅读了上面的评论后,我发现[self.view endEditing:YES]从我在textFieldDidBeginEditing中的位置移动到textFieldSHOULDBeginEditing对我来说是诀窍。现在键盘在我的转场之前正确关闭。

于 2015-03-06T23:30:32.963 回答
0

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

 view.endEditing(true)
于 2018-12-02T17:59:55.210 回答
0

This is a problem i have frequently. My best method to cope is creating a clear button under the keyboard and having that call a dismiss helper. Control the clear button by toggling its isHidden property. Tapping outside the keyboard will hit that clear button and call the dismiss helper. What it won't do is trigger your segue, the user will need to tap again to navigate out but that keyboard will be gone.

in 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

Then add the 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
}

then on your textfield add the target

self.textField.addTarget(self, action: #selector(self.displayClearButton), for: .editingDidBegin)
于 2019-05-16T03:08:18.390 回答