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()
。