Hay una viel eine elegantere Lösung, die mich schon beim ersten Mal umgehauen hat. Vorteile:
- Näher an der OSX-Textfeld-Implementierung, bei der ein Textfeld weiß, wohin der Fokus als nächstes gehen soll
- Verlässt sich nicht auf das Setzen oder Verwenden von Tags, die IMO für diesen Anwendungsfall anfällig sind.
- Kann erweitert werden, um mit beiden zu arbeiten
UITextField
y UITextView
Steuerelemente - oder jedes UI-Steuerelement für die Tastatureingabe
- Überfrachtet den View-Controller nicht mehr mit UITextField-Delegate-Code (Kesselstein)
- Lässt sich gut in IB integrieren und kann über die bekannte Option "Drag-Drop" konfiguriert werden, um Ausgänge zu verbinden.
Erstellen Sie eine UITextField-Unterklasse, die eine IBOutlet
Eigenschaft namens nextField. Hier ist die Überschrift:
@interface SOTextField : UITextField
@property (weak, nonatomic) IBOutlet UITextField *nextField;
@end
Und hier ist die Umsetzung:
@implementation SOTextField
@end
In Ihrem View-Controller erstellen Sie die -textFieldShouldReturn:
Methode delegieren:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if ([textField isKindOfClass:[SOTextField class]]) {
UITextField *nextField = [(SOTextField *)textField nextField];
if (nextField) {
dispatch_async(dispatch_get_current_queue(), ^{
[nextField becomeFirstResponder];
});
}
else {
[textField resignFirstResponder];
}
}
return YES;
}
In IB ändern Sie Ihre UITextFields, um die SOTextField
Klasse. Als nächstes setzen Sie, ebenfalls in IB, den Delegaten für jedes der "SOTextFields" auf "File's Owner" (genau dort, wo Sie den Code für die Delegatenmethode - textFieldShouldReturn - platzieren). Das Schöne an diesem Entwurf ist, dass Sie jetzt einfach mit der rechten Maustaste auf ein beliebiges textField klicken und den nextField-Ausgang dem nächsten SOTextField
Objekt, auf das Sie als nächstes antworten möchten.
![Assigning nextField in IB]()
Außerdem können Sie coole Sachen machen, wie z.B. die textFields in eine Schleife legen, so dass, nachdem das letzte den Fokus verloren hat, das erste wieder den Fokus erhält.
Dies kann leicht erweitert werden, um automatisch die returnKeyType
de la SOTextField
zu einer UIReturnKeyNext
wenn ein nextField zugewiesen ist - eine Sache weniger, die manuell konfiguriert werden muss.