UITextField文本跳转

use*_*732 47 uitextfield ios swift

我有ViewController2个UITextField元素:登录和密码.我为这些字段设置了委托,其中包括以下代码:

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

    return true
}
Run Code Online (Sandbox Code Playgroud)

当他按下键盘上的"下一步"按钮时,此逻辑应将用户从登录文本字段切换为密码.但是我坚持了一个小故障:之后

self.passwordField.becomeFirstResponder()
Run Code Online (Sandbox Code Playgroud)

登录字段中的文本跳转到左上角和后退.而且更奇怪的是:这个故障只是第一次再现,然后你需要重新创建ViewController才能观察到这种行为

这是故障的视频http://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
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ton 52

基于此处发布的其他一些想法,这是一个易于实现的解决方案,适用于所有情况(对我来说),并且似乎没有任何副作用:

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

如果您以编程方式从下一个字段开始,-textFieldShouldReturn:或者如果用户只是触摸另一个响应者,则此解决方案都可以使用.

  • 这真是太棒了,最简单的答案:) (2认同)

lia*_*ols 17

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

-(BOOL)resignFirstResponder
{
    BOOL resigned = [super resignFirstResponder];
    [self layoutIfNeeded];
    return resigned;
}
Run Code Online (Sandbox Code Playgroud)

这里的诀窍是确保你在被叫layoutIfNeeded 之后 resignFirstResponder打电话.

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


Him*_*jan 8

使用此代码可以避免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];
}
Run Code Online (Sandbox Code Playgroud)


IT *_*psy 6

func textFieldDidEndEditing(_ textField: UITextField) {

    textField.layoutIfNeeded()
}
Run Code Online (Sandbox Code Playgroud)


Ram*_*hna 5

我也面临同样的问题.以下代码适用于我.

func textFieldDidEndEditing(_ textField: UITextField) {

    textField.layoutIfNeeded()
}
Run Code Online (Sandbox Code Playgroud)


Dan*_* T. 0

我不给我的文本字段委托。相反,我创建一个 IBAction 并将其附加到“退出时结束”事件。此方法也会出现故障,但仅限于 iOS 9。它看起来是一个操作系统错误。

我的动作看起来像这样:

@IBAction func textFieldAction(sender: UITextField) {
    if sender === usernameField {
        passwordField.becomeFirstResponder()
    }
}
Run Code Online (Sandbox Code Playgroud)

通过上面的操作,故障发生了,但是当我执行下面的操作时,故障就消失了:

@IBAction func textFieldAction(sender: UITextField) {
    if sender === usernameField {
        sender.resignFirstResponder()
        passwordField.becomeFirstResponder()
    }
}
Run Code Online (Sandbox Code Playgroud)

看来我不需要打电话了setNeedsLayout()