1

我想显示一个包含 UITextField 的视图,并且我会自动显示带有消息 becomeFirstResponder 的键盘。使用 iOS 7,没有任何问题。但是从iOS8开始就不行了。我正在像这样配置视图:

- (void)showViewAddScore{
if(!self.viewPopOver){
    //a l'initialisation de la vue, on design le contour
    self.viewPopOver = [self.view viewWithTag:100];
    self.viewPopOver.layer.cornerRadius  = 8;
    self.viewPopOver.layer.masksToBounds = YES;
    self.viewPopOver.layer.borderWidth = 1;
    self.viewPopOver.layer.borderColor = [[UIColor colorWithRed:8.0/255 green:65.0/255 blue:32.0/255 alpha:1] CGColor];
}
//deplacement de la vue
CGPoint point;
point.x = self.viewPopOver.frame.origin.x;
point.y = 300;
[self manageViewPopOver:self.viewPopOver withCGPoint:point];
[self.textfieldAddScore becomeFirstResponder];

}

以及用动画显示视图的方法:

- (void)manageViewPopOver:(UIView *)view withCGPoint:(CGPoint)point {
[UIView animateWithDuration:0.3
                      delay:0.1
                    options:UIViewAnimationOptionCurveLinear
                 animations:^{
                     CGRect frame = view.frame;
                     frame.origin.y = point.y;
                     frame.origin.x = point.x;
                     view.frame = frame;
                 }
                 completion:nil];

}

问题是:当我showViewAddScore第一次调用该方法时,键盘显示但视图不显示。当我第二次调用该方法时,视图正在显示。当我删除 line[self.textfieldAddScore becomeFirstResponder];时,第一次调用该方法时会显示视图。[self.textfieldAddScore becomeFirstResponder];所以,和动画有问题。我试过在动画之后移动这条线,但问题仍然存在。

谢谢您的帮助。

4

2 回答 2

1

在此处输入图像描述

使用仪器,您可以看到 becomeFirstResponder 在我的 6s+ 设备上劫持了相当长一段时间 ~ 150 毫秒的主线程。您可以做的是在您的应用程序委托中初步加载“假”文本视图,如下所示:

        // Preloads keyboard so there's no lag on initial keyboard appearance.
        let lagFreeField: UITextField = UITextField()
        self.window?.addSubview(lagFreeField)
        lagFreeField.becomeFirstResponder()
        lagFreeField.resignFirstResponder()
        lagFreeField.removeFromSuperview()

或者等到您的 UI 工作完成后再调用 becomeFirstResponder,最好是在完成块上。我选择后者以免弄乱 AppDelegate,而前者是一个“hacky”解决方案。

于 2016-03-18T20:18:08.233 回答
0

我有一个简单的视图控制器,只有一个textField. 我想在我的 viewController 加载时显示键盘。

问题,在第一个 viewController 中,我的动画没有结束,当我让 textField(在其他 viewController 中)成为第一响应者并取回第一个 viewController 时,我的动画被阻止了。(不知道为什么?)

我让 becomeFirstResponder 负责这个不需要的动画块。要解决它:

  1. 正如@Gregg 所说:“等到你的 UI 工作完成后再调用becomeFirstResponder。然后我调用becomeFirstResponder我的 textField when viewDidAppear
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if myTextField.canBecomeFirstResponder {
            myTextField.becomeFirstResponder()
        }
    }
  1. 当viewController segue回来时我需要退出键盘,那么最好的方法是使用UITextFieldDelegate
    override func viewDidLoad() {
        super.viewDidLoad()
        // set delegate to self, to textFieldDidEndEditing(:) will call by textField
        myTextFiled.delegate = self
    }
    // UITextFieldDelegate method
    func textFieldDidEndEditing(_ textField: UITextField) {
        textField.resignFirstResponder()
    }
于 2020-07-31T17:27:15.503 回答