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.

9voto

iKushal Punkte 2529
 -(BOOL)textFieldShouldReturn:(UITextField *)textField
{
   [[self.view viewWithTag:textField.tag+1] becomeFirstResponder];
   return YES;
}

8voto

Christian Schnorr Punkte 10608

Ich bin überrascht, wie viele Antworten hier ein einfaches Konzept nicht verstehen: Die Navigation durch Steuerelemente in Ihrer Anwendung ist nicht etwas, was die Ansichten selbst tun sollten. Es ist die Controller Die Entscheidung, welche Kontrolle der nächste Ersthelfer sein soll, ist Aufgabe der Kommission.

Außerdem bezogen sich die meisten Antworten nur auf die Vorwärtsnavigation, aber die Benutzer möchten vielleicht auch rückwärts navigieren.

Also habe ich mir Folgendes ausgedacht. Ihr Formular sollte von einem View-Controller verwaltet werden, und View-Controller sind Teil der Responder-Kette. Es steht Ihnen also völlig frei, die folgenden Methoden zu implementieren:

#pragma mark - Key Commands

- (NSArray *)keyCommands
{
    static NSArray *commands;

    static dispatch_once_t once;
    dispatch_once(&once, ^{
        UIKeyCommand *const forward = [UIKeyCommand keyCommandWithInput:@"\t" modifierFlags:0 action:@selector(tabForward:)];
        UIKeyCommand *const backward = [UIKeyCommand keyCommandWithInput:@"\t" modifierFlags:UIKeyModifierShift action:@selector(tabBackward:)];

        commands = @[forward, backward];
    });

    return commands;
}

- (void)tabForward:(UIKeyCommand *)command
{
    NSArray *const controls = self.controls;
    UIResponder *firstResponder = nil;

    for (UIResponder *const responder in controls) {
        if (firstResponder != nil && responder.canBecomeFirstResponder) {
            [responder becomeFirstResponder]; return;
        }
        else if (responder.isFirstResponder) {
            firstResponder = responder;
        }
    }

    [controls.firstObject becomeFirstResponder];
}

- (void)tabBackward:(UIKeyCommand *)command
{
    NSArray *const controls = self.controls;
    UIResponder *firstResponder = nil;

    for (UIResponder *const responder in controls.reverseObjectEnumerator) {
        if (firstResponder != nil && responder.canBecomeFirstResponder) {
            [responder becomeFirstResponder]; return;
        }
        else if (responder.isFirstResponder) {
            firstResponder = responder;
        }
    }

    [controls.lastObject becomeFirstResponder];
}

Es kann eine zusätzliche Logik für das Scrollen von zuvor sichtbaren Offscreen-Respondern gelten.

Ein weiterer Vorteil dieses Ansatzes ist, dass Sie nicht alle Arten von Steuerelementen, die Sie möglicherweise anzeigen möchten, unterklassifizieren müssen (wie UITextField s), sondern kann stattdessen die Logik auf Controller-Ebene verwalten, wo, seien wir ehrlich, die der richtige Ort zu tun.

7voto

Mohammad Sadiq Punkte 4657

Wenn jemand so etwas möchte. Ich denke, dies ist die am nächsten an den Anforderungen in Frage gefragt

enter image description here

So habe ich dies umgesetzt

Fügen Sie Zubehöransichten für jedes Textfeld hinzu, für das Sie die Einstellungen vornehmen möchten, indem Sie

func setAccessoryViewFor(textField : UITextField)    {
    let toolBar = UIToolbar()
    toolBar.barStyle = .default
    toolBar.isTranslucent = true
    toolBar.sizeToFit()

    // Adds the buttons

    // Add previousButton
    let prevButton = UIBarButtonItem(title: "<", style: .plain, target: self, action: #selector(previousPressed(sender:)))
    prevButton.tag = textField.tag
    if getPreviousResponderFor(tag: textField.tag) == nil {
        prevButton.isEnabled = false
    }

    // Add nextButton
    let nextButton = UIBarButtonItem(title: ">", style: .plain, target: self, action: #selector(nextPressed(sender:)))
    nextButton.tag = textField.tag
    if getNextResponderFor(tag: textField.tag) == nil {
        nextButton.title = "Done"
    }

    let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    toolBar.setItems([prevButton,spaceButton,nextButton], animated: false)
    toolBar.isUserInteractionEnabled = true
    textField.inputAccessoryView = toolBar
}

Verwenden Sie die folgenden Funktionen, um Zapfstellen zu bearbeiten

func nextPressed(sender : UIBarButtonItem) {
    if let nextResponder = getNextResponderFor(tag: sender.tag) {
        nextResponder.becomeFirstResponder()
    } else {
        self.view.endEditing(true)
    }

}

func previousPressed(sender : UIBarButtonItem) {
    if let previousResponder = getPreviousResponderFor(tag : sender.tag)  {
        previousResponder.becomeFirstResponder()
    }
}

func getNextResponderFor(tag : Int) -> UITextField? {
    return self.view.viewWithTag(tag + 1) as? UITextField
}

func getPreviousResponderFor(tag : Int) -> UITextField? {
    return self.view.viewWithTag(tag - 1) as? UITextField
}

Sie müssen die textFields-Tags in der Reihenfolge angeben, in der die Schaltfläche next/prev reagieren soll.

7voto

mahesh chowdary Punkte 432

Setzen Sie zuerst die Return-Taste der Tastatur in der xib, sonst können Sie den Code in viewdidload :

passWord.returnKeyType = UIReturnKeyNext;

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if(textField == eMail) {
        [textField resignFirstResponder];
        [userName becomeFirstResponder];
    }
    if (textField==userName) {
        [textField resignFirstResponder];
        [passWord becomeFirstResponder];
    }
    if (textField==passWord) {
        [textField resignFirstResponder];
        [country becomeFirstResponder];
    }
    if (textField==country) {
        [textField resignFirstResponder];
    }
    return YES;
}

7voto

jcrowson Punkte 4270

Eine sehr einfache Methode, um die Tastatur zu schließen, wenn die Schaltfläche "Fertig" gedrückt wird, ist die folgende:

Erstellen Sie eine neue IBAction in der Kopfzeile

- (IBAction)textFieldDoneEditing:(id)sender;

Fügen Sie in der Implementierungsdatei (.m-Datei) die folgende Methode hinzu:

- (IBAction)textFieldDoneEditing:(id)sender 
{ 
  [sender resignFirstResponder];
}

Wenn Sie dann die IBAction mit dem Textfeld verknüpfen wollen, verknüpfen Sie sie mit dem Ereignis "Did End On Exit".

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