UITextField文本跳转

我有ViewController与2 UITextField元素:login和密码。 我为这些字段设置了委托,其中包括以下代码:

 func textFieldShouldReturn(textField: UITextField) -> Bool { if textField === self.loginField { self.loginField.resignFirstResponder() self.passwordField.becomeFirstResponder() return false } return true } 

当他按下键盘上的下一步button时,这个逻辑应该将用户从login文本字段切换到密码。 但是,我坚持有小故障:之后

 self.passwordField.becomeFirstResponder() 

login字段中的文本跳转到左上angular并返回。 更奇怪的是:这个毛刺只是第一次重现,那么你需要重新创buildViewController来观察这个行为

这里是故障的videohttp://tinypic.com/player.php?v=6nsemw%3E&s=8#.VgVb3cuqpHx

我结束了这个:

 func textFieldShouldReturn(textField: UITextField) -> Bool { if textField === self.loginField { self.loginField.resignFirstResponder() // Shitty workaround. Hi, Apple! self.loginField.setNeedsLayout() self.loginField.layoutIfNeeded() self.passwordField.becomeFirstResponder() return false } return true } 

基于这里发布的其他一些想法,这是一个易于实现的解决scheme,适用于所有情况(对我而言),并且看起来没有任何副作用:

 - (void)textFieldDidEndEditing:(UITextField *)textField { // Workaround for the jumping text bug. [textField resignFirstResponder]; [textField layoutIfNeeded]; } 

如果你从-textFieldShouldReturn:以编程方式进入下一个字段,或者用户只是触及另一个响应者,这个解决scheme就可以工作。

UITextField子类中,您可以执行以下操作:

 -(BOOL)resignFirstResponder { BOOL resigned = [super resignFirstResponder]; [self layoutIfNeeded]; return resigned; } 

这里的技巧是确保在调用resignFirstResponder 之后调用layoutIfNeeded

这样做是非常方便的,因为你不需要在委托callback中自己调用resignFirstResponder ,因为这会导致我在UIScrollView内部出现问题,但是上面并没有:)

使用此代码来避免在UITextField中跳转文本。

 - (BOOL) textFieldShouldReturn:(UITextField *)textField{ if(textField == self.txtUserName){ [self.txtEmail becomeFirstResponder]; } else if (textField == self.txtEmail){ [self.txtPassword becomeFirstResponder]; } else if (textField == self.txtPassword){ [self.txtConfirmPassword becomeFirstResponder]; } else if (textField == self.txtConfirmPassword){ [self.txtFirstName becomeFirstResponder]; } else{ [textField resignFirstResponder]; } return YES; } - (void)textFieldDidEndEditing:(UITextField *)textField { [textField resignFirstResponder]; [textField layoutIfNeeded]; } 

我也面临同样的问题。 下面的代码是为我工作的。

 func textFieldDidEndEditing(_ textField: UITextField) { textField.layoutIfNeeded() } 
 func textFieldDidEndEditing(_ textField: UITextField) { textField.layoutIfNeeded() } 

根据我的理解:

这个问题可能是由于键盘上的布局更改或callback中处理的animation会显示和隐藏通知(通常在您希望文本字段被上推以避免键盘隐藏的情况下)。

解决scheme:我正在面对这个问题,因为我在做layoutIfNeeded每次键盘显示被认为是安全的,显然它不是,所以当我做了一个检查,只有当需要改变框架,跳跃停止。

更多的“通用”选项是在你的UITextField子类中使用通知:

  - (void)setupJumpingTextWorkaround { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(forceLayout) name:UITextFieldTextDidEndEditingNotification object:self]; } - (void)forceLayout { [self setNeedsLayout]; [self layoutIfNeeded]; } 

不要忘记取消订阅

我不给我的文字字段的代表。 相反,我创build一个IBAction并将其附加到“退出结束”事件。 这个方法也出现了小故障,但只在iOS 9中出现。它看起来是一个操作系统错误。

我的行为如下所示:

 @IBAction func textFieldAction(sender: UITextField) { if sender === usernameField { passwordField.becomeFirstResponder() } } 

如上所述,小故障发生,但当我做下面的小故障消失:

 @IBAction func textFieldAction(sender: UITextField) { if sender === usernameField { sender.resignFirstResponder() passwordField.becomeFirstResponder() } } 

我似乎不需要调用setNeedsLayout()