it-swarm.com.de

UITextField-Text springt

Ich habe ViewController mit 2 UITextField Elementen: Login und Passwort. Ich habe Delegaten für diese Felder festgelegt, die den folgenden Code enthalten:

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

    return true
}

Diese Logik sollte den Benutzer vom Anmeldetextfeld zum Kennwort wechseln, wenn er auf der Tastatur die Taste Weiter drückt. Aber ich blieb bei Glitch: nach

self.passwordField.becomeFirstResponder()

text im Anmeldefeld springt in die linke obere Ecke und zurück. Und was noch seltsamer ist: Dieser Störimpuls reproduziert erst beim ersten Mal, dann müssen Sie ViewController neu erstellen, um dieses Verhalten zu beobachten

Hier ist das Video des Glitch http://tinypic.com/player.php?v=6nsemw%3E&s=8#.VgVb3cuqpHx

Ich endete damit:

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
}
47
user3237732

Basierend auf einigen anderen Ideen, die hier veröffentlicht wurden, ist dies eine Lösung, die einfach zu implementieren ist (für mich) in allen Fällen funktioniert und scheinbar keine Nebenwirkungen hat:

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

Diese Lösung funktioniert sowohl, wenn Sie programmgesteuert von -textFieldShouldReturn: zum nächsten Feld wechseln oder der Benutzer nur einen anderen Responder berührt.

50
Dave Batton

In einer UITextField-Unterklasse können Sie Folgendes tun:

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

Der Trick besteht darin, sicherzustellen, dass Sie layoutIfNeededaufrufen, nachdemresignFirstResponder aufgerufen wurde.

Dies auf diese Weise zu tun ist sehr praktisch, da Sie resignFirstResponder nicht selbst in den Delegate-Callbacks aufrufen müssen, da dies zu Problemen in einer UIScrollView führte.

16
liamnichols

Verwenden Sie diesen Code, um das Springen von Text in UITextField zu vermeiden.

- (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];
}
8
func textFieldDidEndEditing(_ textField: UITextField) {

    textField.layoutIfNeeded()
}
5
IT Gypsy

Ich habe auch das gleiche Problem. Der folgende Code ist für mich gearbeitet.

func textFieldDidEndEditing(_ textField: UITextField) {

    textField.layoutIfNeeded()
}
5
Ramakrishna

Basierend auf dem, was ich unter dies verstehe:

Dieses Problem kann auftreten, wenn Layoutänderungen vorgenommen werden oder Animationen in den Rückrufen für die Tastatur ausgeführt werden, um Benachrichtigungen anzuzeigen und auszublenden (normalerweise, wenn das Textfeld nach oben verschoben werden soll, damit die Tastatur es nicht verbirgt).

Lösung: Ich stand vor diesem Problem, als ich Layouts erstellte. Jedes Mal, wenn Keyboard angezeigt wird, wurde angenommen, dass es sicher ist. Offensichtlich ist dies nicht der Fall. Wenn ich also einen Haken dazu setze, wenn der Frame gewechselt werden muss, wurde der Sprung gestoppt.

1
Santhosh R

Eine "generische" Option ist die Verwendung von Benachrichtigungen direkt in Ihrer UITextField Unterklasse:

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

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

Vergessen Sie nicht, sich abzumelden

1
d.lebedev

Ich gebe meinen Textfeldern keine Delegierten. Stattdessen erstelle ich eine IBAction und füge sie dem Ereignis "Did End On Exit" bei. Die Störung tritt auch bei dieser Methode auf, aber nur unter iOS 9. Es scheint ein Betriebssystemfehler zu sein.

Meine Aktion sieht so aus:

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

Mit dem oben genannten passiert die Störung, aber wenn ich das mache, geht die Störung weg:

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

Ich brauche anscheinend nicht setNeedsLayout() anzurufen.

0
Daniel T.