2009-06-14 12 views
27

Używam wartości "Dalej" dla "Return Key", aby uzyskać przycisk Next zamiast przycisku Gotowe, ale (oczywiście) naciśnięcie go nie spowoduje automatycznie przejścia do następnego pola UITextField w moim widoku.Najlepszy sposób użycia przycisku "Dalej" przycisku Powrót na UITextField, aby przejść do następnego UITextField

Co to jest właściwy sposób? W przypadku większego tematu, jakie są wskazówki dotyczące właściwego budowania formularzy w pakiecie iPhone SDK?

+1

Aby oznaczyć jako odpowiedź prawidłowa, wystarczy kliknąć ikonę pusty zaznaczenia obok odpowiedź ... –

Odpowiedz

36

Wpisz obiekt jako pierwszy element pola tekstowego i zaimplementuj metodę - (BOOL)textFieldShouldReturn:(UITextField *)textField; w tym celu wywołaj drugie pole tekstowe: -becomeFirstResponder. Zwrócenie YES z tego spowoduje, że pole tekstowe wykona domyślne zachowanie przycisku powrotu - myślę, że generalnie wysyła wiadomość o działaniu. Jeśli nie masz nic dodanego jako cel tego działania, nie ma znaczenia, co powrócisz.

+1

.. .Jeśli jesteś na ostatnim UITextField, powinieneś zadzwonić do resignFirstResponder, aby ukryć klawiaturę. –

+0

jest to zupełnie inny sposób niż wyjaśniono tutaj (http://stackoverflow.com/questions/467881/how-do-you-change-the-uicontrol-with-focus-on-iphone) lub oba będą działać równie dobrze ? – HollerTrain

+0

Albo zadziała. Moja odpowiedź wykorzystuje system delegacji, Brad jest materiałem do działania docelowego. –

34

Aby zbudować na odpowiedź Noego, jeśli masz wiele pól tekstowych i nie ochotę pęczek jeśli'S, można zrobić to w ten sposób:

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    //[[self.view viewWithTag:textField.tag+1] becomeFirstResponder]; 

    UIView *view = [self.view viewWithTag:textField.tag + 1];  
    if (!view)   
      [textField resignFirstResponder];  
    else   
      [view becomeFirstResponder]; 
    return YES; 
} 

Po oznaczyć każde pole tekstowe zaczynając każda liczba, o ile są one kolejno oznaczone w scenorysie lub w kodzie, powinna działać.

+0

Świetne rozwiązanie! Jeden (mniejszy) zasugerował ulepszenie - test dla viewWithTag == nil: 'UIView * view = [self.view viewWithTag: textField.tag + 1]; if (! View) [textField resignFirstResponder]; else [view becomeFirstResponder]; ' – CharlesA

1

Wydaje się to działać całkiem dobrze i nie wymaga systemu znaczników, który sugeruje wiele. Są jednak dwie rzeczy do zapamiętania w tym rozwiązaniu:

  • Wszystkie UITextFields muszą znajdować się w tym samym UIView (mieć ten sam superview).
  • UITextFields muszą być we właściwej kolejności w konstruktorze interfejsów.

    -(BOOL)textFieldShouldReturn:(UITextField *)textField { 
        /* 
        * 1. Loop through the textfield's superview 
        * 2. Get the next textfield in the superview 
        * 3. Focus that textfield 
        */ 
    
        UIView *superView = [textField superview]; 
        BOOL foundCurrent = false; 
        for (UITextField *tf in superView.subviews) { 
         // Set focus on the next textfield 
         if (foundCurrent) { 
         [tf becomeFirstResponder]; 
         return NO; 
         } 
    
        //Find current textfield 
        if ([tf isEqual:textField]) { 
         foundCurrent = true; 
         } 
        } 
    
        return YES; 
    }  
    
0

mam zmaga się z tym problemem zbyt ... iw rezultacie stworzyłem małą bibliotekę do obsługi wielu pól tekstowych. Można go znaleźć na github GNKeyboardAwareScrollView#GNTextFieldsManager.

można zainicjować go z tablicy pól tekstowych:

NSArray *myTextFields = @[...]; // the order of array matters! 
GNTextFieldsManager *manager = [[GNTextFieldsManager alloc] initWithTextFields:myTextFields]; 

lub podając Zobacz główne (i ustawienie znaczników dla wszystkich widoków):

GNTextFieldsManager *manager = [[GNTextFieldsManager alloc] initWithView:self.view]; 

nadzieję, że będzie użyteczny dla kogoś:)

1

Nie lubię zajmować się tagami, więc oto moje rozwiązanie. Utwórz IBOutletCollection wszystkich twoich tekstowych pól w swoim ViewController, przeciągnij, aby połączyć swoje pola tekstowe w kolejności od góry do dołu.

@interface ViewController() <UITextFieldDelegate> 
@property (strong, nonatomic) IBOutletCollection(UITextField) NSArray *allTextFields; 
@end 

W viewDidLoad ustaw swoją delegację textFields. (Lub ustaw go w storyboardie).

for (VVTextField *tf in self.allTextFields) { 
    tf.delegate = self; 
} 

Następnie wdrożyć UITextField Delegata

#pragma mark - UITextField Delegate 

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    NSUInteger currentIndex = [self.allTextFields indexOfObject:textField]; 
    NSUInteger nextIndex = currentIndex+1; 
    if (nextIndex < self.allTextFields.count) { 
     [[self.allTextFields objectAtIndex:nextIndex] becomeFirstResponder]; 
    } else { 
     [[self.allTextFields objectAtIndex:currentIndex] resignFirstResponder]; 
    } 
    return YES; 
} 
+1

Może to działać, ale obiekty w tablicy' IBOutletCollection' nie będą gwarantowane we właściwej kolejności. – JAL

+0

@JAL Ma świetny punkt. Powinieneś rozważyć edytowanie swojej odpowiedzi lub odwzorowanie wartości w pewien sposób. Może to spowodować nieoczekiwane zachowanie. –

2

Dla Swift:

func textFieldShouldReturn(textField: UITextField) -> Bool { 
//your collection of textfields 
    guard let i = textFields.indexOf(textField) else { return false } 
    if i + 1 < textFields.count { 
     textFields[i + 1].becomeFirstResponder() 
     return true 
    } 
    textField.resignFirstResponder() 
    return true 
} 
Powiązane problemy