511 Stimmen

So navigieren Sie durch Textfelder (Schaltflächen "Weiter" / "Fertig")

Wie kann ich mit der "Weiter"-Taste auf der iPhone-Tastatur durch alle meine Textfelder navigieren?

Das letzte Textfeld sollte die Tastatur schließen.

Ich habe die IB the Buttons (Next / Done) eingerichtet, aber jetzt komme ich nicht weiter.

Ich habe die Aktion textFieldShouldReturn implementiert, aber jetzt schließen die Schaltflächen Next und Done die Tastatur.

25voto

mohamede1945 Punkte 6972

Eine konsistentere und robustere Methode ist die Verwendung von NextResponderTextField Sie können es vollständig vom Interface Builder aus konfigurieren, ohne dass Sie den Delegaten setzen oder die view.tag .

Alles, was Sie tun müssen, ist

  1. Legen Sie die Klassenart Ihrer UITextField zu sein NextResponderTextField enter image description here
  2. Stellen Sie dann den Ausgang des nextResponderField um auf den nächsten Responder hinzuweisen, kann alles sein UITextField oder jede UIResponder Unterklasse. Es kann auch ein UIButton sein und die Bibliothek ist intelligent genug, um die TouchUpInside Ereignis der Schaltfläche nur, wenn sie aktiviert ist. enter image description here enter image description here

Hier sehen Sie die Bibliothek in Aktion:

enter image description here

14voto

Marquee Punkte 1665

Mir gefallen die OO-Lösungen, die bereits von Anth0 und Answerbot vorgeschlagen wurden. Allerdings habe ich an einer schnellen und kleinen POC gearbeitet, daher wollte ich die Dinge nicht mit Unterklassen und Kategorien überladen.

Eine andere einfache Lösung besteht darin, ein NSArray von Feldern zu erstellen und das nächste Feld zu suchen, wenn Sie next drücken. Dies ist keine OO-Lösung, aber schnell, einfach und leicht zu implementieren. Außerdem können Sie die Reihenfolge auf einen Blick sehen und ändern.

Hier ist mein Code (basierend auf anderen Antworten in diesem Thread):

@property (nonatomic) NSArray *fieldArray;

- (void)viewDidLoad {
    [super viewDidLoad];

    fieldArray = [NSArray arrayWithObjects: firstField, secondField, thirdField, nil];
}

- (BOOL) textFieldShouldReturn:(UITextField *) textField {
    BOOL didResign = [textField resignFirstResponder];
    if (!didResign) return NO;

    NSUInteger index = [self.fieldArray indexOfObject:textField];
    if (index == NSNotFound || index + 1 == fieldArray.count) return NO;

    id nextField = [fieldArray objectAtIndex:index + 1];
    activeField = nextField;
    [nextField becomeFirstResponder];

    return NO;
}
  • Ich gebe immer NEIN zurück, weil ich nicht möchte, dass ein Zeilenumbruch eingefügt wird. Ich wollte nur darauf hinweisen, dass ich bei der Rückgabe von YES automatisch die nachfolgenden Felder verlassen oder einen Zeilenumbruch in meiner TextView einfügen würde. Ich habe ein bisschen Zeit gebraucht, um das herauszufinden.
  • activeField merkt sich das aktive Feld für den Fall, dass ein Bildlauf erforderlich ist, um das Feld von der Tastatur freizugeben. Wenn Sie einen ähnlichen Code haben, stellen Sie sicher, dass Sie das activeField zuweisen, bevor Sie den ersten Responder ändern. Die Änderung des Erstansprechpartners erfolgt sofort und löst sofort das Ereignis KeyboardWasShown aus.

12voto

picciano Punkte 21832

Hier ist eine Implementierung von Tabbing unter Verwendung einer Kategorie auf UIControl. Diese Lösung hat alle Vorteile der Methoden von Michael und Anth0, funktioniert aber für alle UIControls, nicht nur für UITextField s. Es funktioniert auch nahtlos mit Interface Builder und Storyboards.

Quelle und Beispielanwendung: GitHub-Repository für UIControlsWithTabbing

Verwendung:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField transferFirstResponderToNextControl];
    return NO;
}

Assigning nextControl in Interface Builder

Überschrift:

//
// UIControl+NextControl.h
// UIControlsWithTabbing
//

#import <UIKit/UIKit.h>

@interface UIControl (NextControl)

@property (nonatomic, weak) IBOutlet UIControl *nextControl;

- (BOOL)transferFirstResponderToNextControl;

@end

Umsetzung:

#import "UIControl+NextControl.h"
#import <objc/runtime.h>

static char defaultHashKey;

@implementation UIControl (NextControl)

- (UIControl *)nextControl
{
    return objc_getAssociatedObject(self, &defaultHashKey);
}

- (void)setNextControl:(UIControl *)nextControl
{
    objc_setAssociatedObject(self, &defaultHashKey, nextControl, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (BOOL)transferFirstResponderToNextControl
{
    if (self.nextControl)
    {
        [self.nextControl becomeFirstResponder];

        return YES;
    }

    [self resignFirstResponder];

    return NO;
}

@end

10voto

Ich habe viele Codes ausprobiert, und schließlich funktionierte dies für mich in Swift 3.0 Aktuell [März 2017]

El ViewController Klasse geerbt werden sollte die UITextFieldDelegate dafür, dass dieser Code funktioniert.

class ViewController: UIViewController,UITextFieldDelegate  

Fügen Sie das Textfeld mit der richtigen Tag-Nummer hinzu. Diese Tag-Nummer wird verwendet, um das Steuerelement in das entsprechende Textfeld zu bringen, das auf der ihm zugewiesenen inkrementellen Tag-Nummer basiert.

override func viewDidLoad() {
    userNameTextField.delegate = self
    userNameTextField.tag = 0
    userNameTextField.returnKeyType = UIReturnKeyType.next
    passwordTextField.delegate = self
    passwordTextField.tag = 1
    passwordTextField.returnKeyType = UIReturnKeyType.go
}

In dem obigen Code wird die returnKeyType = UIReturnKeyType.next wobei die Return-Taste auf der Tastatur wie folgt angezeigt wird Next haben Sie auch andere Möglichkeiten als Join/Go usw., ändern Sie die Werte je nach Ihrer Anwendung.

Este textFieldShouldReturn ist eine Methode, die von UITextFieldDelegate gesteuert wird, und hier haben wir die nächste Feldauswahl basierend auf der Tag-Wert-Inkrementierung

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField {
        nextField.becomeFirstResponder()
    } else {
        textField.resignFirstResponder()
        return true;
    }
    return false
 }

9voto

Nachdem Sie ein Textfeld verlassen haben, rufen Sie [otherTextField becomeFirstResponder] auf und das nächste Feld erhält den Fokus.

Das kann ein kniffliges Problem sein, da man oft auch den Bildschirm rollen oder die Position des Textfeldes anpassen muss, damit es beim Bearbeiten gut zu sehen ist. Testen Sie einfach ausgiebig, wie Sie auf verschiedene Weise in die Textfelder hinein- und wieder herauskommen und wie Sie sie vorzeitig verlassen (geben Sie dem Benutzer immer die Möglichkeit, die Tastatur zu schließen, anstatt zum nächsten Feld zu gehen, normalerweise mit "Fertig" in der Navigationsleiste).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X