UITextField文本跳转

时间:2015-09-24 15:32:20

标签: ios swift uitextfield

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

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

    return true
}

当他按下键盘上的“下一步”按钮时,此逻辑应将用户从登录文本字段切换为密码。但我坚持不懈:在

之后
self.passwordField.becomeFirstResponder()
登录字段中的

文本跳转到左上角和后面。而且更奇怪的是:这个故障只是第一次重现,然后你需要重新创建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
}

8 个答案:

答案 0 :(得分:50)

基于此处发布的其他一些想法,这是一个易于实施的解决方案,在所有情况下都适用(对我而言),并且看起来没有任何副作用:

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

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

答案 1 :(得分:16)

<script type="text/javascript"> $(document).on('keyup', '.test', function() { var x = $(this).val(); $(this).val(x.toString().replace(/,/g, "").replace(/\B(?=(\d{3})+(?!\d))/g, ",")); }); </script> <form> <input class="test" type="text" /> </form> 子类中,您可以执行以下操作:

UITextField

这里的诀窍是确保在调用 -(BOOL)resignFirstResponder { BOOL resigned = [super resignFirstResponder]; [self layoutIfNeeded]; return resigned; } 后致电layoutIfNeeded

这样做是非常方便的,因为你不需要自己在委托回调中调用resignFirstResponder,因为这会导致我在resignFirstResponder内部出现问题,但上述情况并非如此。 t:)

答案 2 :(得分:8)

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

attributes

答案 3 :(得分:5)

func textFieldDidEndEditing(_ textField: UITextField) {

    textField.layoutIfNeeded()
}

答案 4 :(得分:5)

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

func textFieldDidEndEditing(_ textField: UITextField) {

    textField.layoutIfNeeded()
}

答案 5 :(得分:1)

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

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

- (void)forceLayout {
        [self setNeedsLayout];
        [self layoutIfNeeded];
    }

不要忘记取消订阅

答案 6 :(得分:1)

根据我对this的理解:

当您在键盘的回调中处理布局更改或动画时,可能会导致此问题显示和隐藏通知(通常在您希望文本字段被推高以便键盘不会隐藏它的情况下)

解决方案:    我正在面对这个问题,因为我每次键盘显示时都会执行layoutIfNeeded,假设它是安全的,显然不是,所以当我只在需要更换帧时进行检查时,跳转停止了。 / p>

答案 7 :(得分:0)

我没有给我的文本字段代表。相反,我创建了一个IBAction并将其附加到&#34; Do End On Exit&#34;事件。这种方法也会出现故障,但仅限于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()