Jak poruszać się po wszystkich polach tekstowych za pomocą przycisku „Dalej” na klawiaturze iPhone'a?
Ostatnie pole tekstowe powinno zamknąć klawiaturę.
Mam ustawione przyciski IB (Dalej / Gotowe), ale teraz utknąłem.
Zaimplementowałem akcję textFieldShouldReturn, ale teraz przyciski Dalej i Gotowe zamykają klawiaturę.
ios
objective-c
iphone
phx
źródło
źródło
Odpowiedzi:
W Cocoa dla Mac OS X masz kolejny łańcuch odpowiedzi, w którym możesz zapytać pole tekstowe, na czym powinna się skupić kontrola. To sprawia, że tabulacje między polami tekstowymi działają. Ale ponieważ urządzenia iOS nie mają klawiatury, tylko dotyk, ta koncepcja nie przetrwała przejścia na Cocoa Touch.
Można to i tak łatwo zrobić, przyjmując dwa założenia:
UITextField
są w tym samym widoku nadrzędnym.Zakładając, że możesz zastąpić funkcję textFieldShouldReturn: as this:
Dodaj trochę kodu, a założenia można również zignorować.
Swift 4.0
Jeśli nadzorem pola tekstowego będzie UITableViewCell, to następnym odpowiadającym będzie
źródło
UITableViewCell
. Będziesz musiał uzyskać dostęp do powiązanegoUITableView
i uzyskać komórkę zawierającą szukane pole tekstowe.UITextFieldDelegate
i ustawić delegatów pól tekstowych.Jest o wiele bardziej eleganckie rozwiązanie, które zaskoczyło mnie, gdy go zobaczyłem po raz pierwszy. Korzyści:
UITextField
iUITextView
dowolnym kontrolerem interfejsu użytkownikaUtwórz podklasę UITextField, która ma
IBOutlet
właściwość o nazwie nextField. Oto nagłówek:A oto wdrożenie:
W kontrolerze widoku utworzysz
-textFieldShouldReturn:
metodę delegowania:W IB zmień swoje UITextFields, aby użyć
SOTextField
klasy. Następnie, również w IB, ustaw delegata dla każdego z „SOTextFields” do „Właściciela pliku” (co jest dokładnie tam, gdzie umieścisz kod dla metody delegowania - textFieldShouldReturn). Piękno tego projektu polega na tym, że teraz możesz po prostu kliknąć prawym przyciskiem myszy dowolny textField i przypisać ujście nextField do następnegoSOTextField
obiektu, który chcesz być kolejnym responderem.Co więcej, możesz robić fajne rzeczy, takie jak zapętlanie pól tekstowych, aby po tym, jak ostatni straci fokus, pierwszy otrzyma fokus ponownie.
To można łatwo rozszerzyć, aby automatycznie przypisać
returnKeyType
zSOTextField
DoUIReturnKeyNext
jeśli istnieje nextField przypisane - jeden mniej rzeczy ręcznie Konfiguruj.źródło
UITableView
. Chociaż mamIBOutlet
właściwości kontrolera widoku dla każdego pola tekstowego, nie pozwala mi to powiązaćnextField
właściwości z tymi właściwościami właściciela pliku. Czy jest jakaś rada, jak sprawić, by działała w tym scenariuszu?textField1.nextField = textField2; textField2.nextField = textField3;
itd.Oto jeden bez delegacji:
ObjC:
Działa przy użyciu (najczęściej nieznanej)
UIControlEventEditingDidEndOnExit
UITextField
akcji.Możesz również łatwo podłączyć to w scenorysie, więc nie jest wymagana delegacja ani kod.
Edycja: w rzeczywistości nie mogę wymyślić, jak podłączyć to w scenorysie.
becomeFirstResponder
nie wydaje się być oferowaną akcją dla tego zdarzenia kontrolnego, a szkoda. Nadal możesz podpiąć wszystkie pola tekstowe do jednej akcji w ViewController, która następnie określa, który textField ma byćbecomeFirstResponder
oparty na nadawcy (chociaż nie jest tak elegancki jak powyższe rozwiązanie programowe, więc IMO zrobi to z powyższym kodemviewDidLoad
).źródło
[tfN addTarget:self action:@selector(loginButtonTapped:) forControlEvents:UIControlEventEditingDidEndOnExit];
. Dzięki @mxcl.Oto moje rozwiązanie tego problemu.
Aby rozwiązać ten problem (a ponieważ nie lubię polegać na tagach do robienia różnych rzeczy), postanowiłem dodać właściwość niestandardową do obiektu UITextField. Innymi słowy, utworzyłem kategorię na UITextField w następujący sposób:
UITextField + Extended.h
UITextField + Extended.m
Oto jak go używam:
I zaimplementuj metodę textFieldShouldReturn:
Mam teraz rodzaj powiązanej listy UITextField, z których każdy wie, kto będzie następny w kolejce.
Mam nadzieję, że to pomoże.
źródło
Szybkie rozszerzenie, które stosuje odpowiedź mxcl, aby uczynić to szczególnie łatwym (dostosowanym do wersji swift 2.3 przez Traveler):
Jest łatwy w użyciu:
Rozszerzenie ustawi przycisk powrotu na „Dalej” dla wszystkich pól oprócz ostatniego i na „Gotowe” dla ostatniego pola, a po naciśnięciu klawisza przesuń fokus / wyłącz klawiaturę.
Szybki <2.3
SWIFT 3: użyj w ten sposób -
źródło
UITextFieldDelegate
i go wdrożyćfunc textFieldDidEndEditing(textField: UITextField)
. Po prostu wróć wcześniej, jeślitextField != field3
.Bardziej spójnym i niezawodnym sposobem jest użycie NextResponderTextField. Można go skonfigurować całkowicie z poziomu konstruktora interfejsów, bez potrzeby ustawiania delegata ani używania
view.tag
.Wszystko, co musisz zrobić, to
UITextField
byćNextResponderTextField
nextResponderField
aby wskazywał na następny obiekt odpowiadający, może to byćUITextField
dowolna lub dowolnaUIResponder
podklasa. Może to być także przycisk UIB, a biblioteka jest wystarczająco inteligentna, aby wywołaćTouchUpInside
zdarzenie przycisku tylko wtedy, gdy jest włączone.Oto biblioteka w akcji:
źródło
Lubię rozwiązania OO, które zostały już zasugerowane przez Anth0 i Answerbot. Pracowałem jednak nad szybkim i małym POC, więc nie chciałem zaśmiecać rzeczy podklasami i kategoriami.
Innym prostym rozwiązaniem jest utworzenie zestawu pól NSA i wyszukiwanie następnego pola po naciśnięciu przycisku next. Nie jest to rozwiązanie OO, ale szybkie, proste i łatwe do wdrożenia. Możesz również zobaczyć i zmodyfikować kolejność na pierwszy rzut oka.
Oto mój kod (oparty na innych odpowiedziach w tym wątku):
źródło
Oto implementacja tabulacji przy użyciu kategorii w UIControl. To rozwiązanie ma wszystkie zalety metod Michaela i Anth0, ale działa dla wszystkich UIControls, nie tylko
UITextField
s. Działa również płynnie z konstruktorem interfejsów i scenorysami.Źródło i przykładowa aplikacja: repozytorium GitHub dla UIControlsWithTabbing
Stosowanie:
Nagłówek:
Realizacja:
źródło
Wypróbowałem wiele kodów i na koniec zadziałało to w Swift 3.0 Latest [marzec 2017]
ViewController
Klasa powinna być odziedziczyłUITextFieldDelegate
do wykonywania tej pracy kodu.Dodaj pole tekstowe z odpowiednim numerem znacznika, a ten numer znacznika służy do przeniesienia kontroli do odpowiedniego pola tekstowego na podstawie przypisanego mu przyrostowego numeru znacznika.
W powyższym kodzie,
returnKeyType = UIReturnKeyType.next
gdzie sprawi, że klawisz powrotu klawiatury będzie wyświetlany, ponieważNext
masz również inne opcje, takie jakJoin/Go
itp., W zależności od aplikacji zmień wartości.Jest
textFieldShouldReturn
to metoda kontrolowana przez UITextFieldDelegate i tutaj mamy następny wybór pola na podstawie przyrostu wartości Tagźródło
UITextView
. Masz pomysł, jak to zrobić w połączeniu?UITextField
(wprowadź pojedynczy wiersz tekstu), drugi toUITextView
(wprowadź wiele wierszy).UITextView
oczywiście nie odpowiada na ten kod, ale można go użyć w formularzach.Po wyjściu z jednego pola tekstowego wywołujesz [otherTextField staje sięFirstResponder], a następne pole staje się aktywne.
Może to być trudny problem, ponieważ często będziesz chciał przewijać ekran lub w inny sposób zmieniać pozycję pola tekstowego, aby łatwo było go zobaczyć podczas edycji. Po prostu upewnij się, że wykonałeś wiele testów, wchodząc i wychodząc z pól tekstowych na różne sposoby, a także wychodząc wcześniej (zawsze daj użytkownikowi opcję zwolnienia klawiatury zamiast przechodzenia do następnego pola, zwykle z „Gotowe” w pasek nawigacyjny)
źródło
źródło
Bardzo łatwą metodą zwolnienia klawiatury po naciśnięciu przycisku „Gotowe” jest:
Utwórz nowy IBAction w nagłówku
W pliku implementacji (plik .m) dodaj następującą metodę:
Następnie, gdy dojdziesz do połączenia IBAction z polem tekstowym - link do wydarzenia „Did End On Exit”.
źródło
Najpierw ustaw klawisz powrotu na klawiaturze w Xib, w przeciwnym razie możesz napisać kod w
viewdidload
:źródło
Jestem zaskoczony, jak wiele odpowiedzi tutaj nie rozumie jednej prostej koncepcji: poruszanie się po elementach sterujących w aplikacji nie jest czymś, co same widoki powinny robić. Zadaniem kontrolera jest podjęcie decyzji, która kontrola ma być następną pierwszą odpowiedzią.
Większość odpowiedzi dotyczyła tylko nawigacji do przodu, ale użytkownicy mogą chcieć cofnąć się.
Oto co wymyśliłem. Formularzem powinien zarządzać kontroler widoku, a kontrolery widoku są częścią łańcucha respondentów. Zatem możesz całkowicie zaimplementować następujące metody:
Może obowiązywać dodatkowa logika przewijania odpowiedzi poza ekranem widocznych wcześniej.
Kolejną zaletą tego podejścia jest to, że nie trzeba podklasować wszystkich rodzajów elementów sterujących, które możesz chcieć wyświetlić (takich jak
UITextField
s), ale możesz zamiast tego zarządzać logiką na poziomie kontrolera, gdzie, szczerze mówiąc, jest to właściwe miejsce do tego .źródło
Dodałem do odpowiedzi PeyloW na wypadek, gdybyś chciał zaimplementować funkcję przycisku poprzedni / następny:
Jeśli podklasujesz UIView w następujący sposób:
źródło
Cześć wszystkim, proszę zobaczyć ten
źródło
Próbowałem rozwiązać ten problem, stosując bardziej wyrafinowane podejście oparte na przypisywaniu każdej komórce (lub
UITextField
)UITableView
unikalnej wartości znacznika, którą można później odzyskać: aktywuj-następny-uitextfield-in-uitableview-iosMam nadzieję, że to pomoże!
źródło
Właśnie stworzyłem nową kapsułę podczas pracy z tymi rzeczami GNTextFieldsCollectionManager . Automatycznie obsługuje następny / ostatni problem z polem tekstowym i jest bardzo łatwy w użyciu:
Pobiera wszystkie pola tekstowe posortowane według hierarchii widoku (lub według znaczników), lub możesz określić własną tablicę pól tekstowych.
źródło
Rozwiązanie w Swift 3.1, po połączeniu pól tekstowych IBOutlets ustaw delegowanie pól tekstowych w viewDidLoad, a następnie nawiguj swoją akcją w textFieldShouldReturn
źródło
Jeśli ktoś tak chce. Myślę, że jest to najbliższe wymaganym pytaniom
Oto jak zaimplementowałem ten
Dodaj widok akcesoriów dla każdego pola tekstowego, dla którego chcesz skonfigurować, używając
Do obsługi kranów służą następujące funkcje
Musisz podać tagi textFields w kolejności, w której ma odpowiadać przycisk Dalej / Wstecz.
źródło
Wolę:
W pliku NIB podpinam textFields w żądanej kolejności do tej tablicy inputFields. Następnie wykonuję prosty test dla indeksu UITextField, który zgłasza, że użytkownik pukał:
źródło
źródło
Miałem około 10+ UITextField na mojej tablicy opowieści, a sposób, w jaki włączyłem następną funkcjonalność, polegał na utworzeniu tablicy UITextField i uczynieniu następnego UITextField pierwszą odpowiedzią. Oto plik implementacyjny:
źródło
Działa to dla mnie w Xamarin.iOS / Monotouch. Zmień przycisk klawiatury na Dalej, przekaż formant do następnego pola UITextField i ukryj klawiaturę po ostatnim polu UITextField.
Wewnątrz ViewDidLoad będziesz mieć:
Jeśli Twoje TextFields nie mają tagu, ustaw go teraz:
i tylko połączenie
źródło
Jest to proste, szybkie rozwiązanie, bez użycia tagów, bez sztuczek w serii ujęć ...
Po prostu użyj tego rozszerzenia:
I nazwij to tak (na przykład) z delegatem pola tekstowego:
źródło
Bezpieczniejszy i bardziej bezpośredni sposób, przy założeniu:
Swift 4.1:
źródło
w textFieldShouldReturn powinieneś sprawdzić, czy pole tekstowe, na którym aktualnie się znajdujesz, nie jest ostatnie, gdy klikną następne i czy nie nie odrzuci klawiatury.
źródło
To jest stary post, ale ma wysoką pozycję w rankingu, więc wprowadzę moje rozwiązanie.
Miałem podobny problem i ostatecznie stworzyłem podklasę
UIToolbar
zarządzania następną / poprzednią / wykonaną funkcją w dynamicznym tableView z sekcjami: https://github.com/jday001/DataEntryToolbarUstawiasz pasek narzędzi jako inputAccessoryView swoich pól tekstowych i dodajesz je do słownika. Umożliwia to przewijanie ich do przodu i do tyłu, nawet w przypadku treści dynamicznych. Istnieją metody delegowania, jeśli chcesz uruchomić własną funkcjonalność, gdy nastąpi nawigacja textField, ale nie musisz zajmować się zarządzaniem żadnymi tagami ani statusem pierwszego odpowiadającego.
W linku GitHub znajdują się fragmenty kodu i przykładowa aplikacja, która pomaga w szczegółach implementacji. Będziesz potrzebował własnego modelu danych, aby śledzić wartości w polach.
źródło
Bez znaczników usings i bez dodawania właściwości dla nextField / nextTextField możesz spróbować emulować TAB, gdzie „testInput” to twoje aktywne pole:
źródło
Korzystam z odpowiedzi Michaela G. Emmonsa od około roku, działa świetnie. Zauważyłem niedawno, że wywołanie resignFirstResponder, a następnie stanie sięFirstResponder natychmiast, może spowodować „usterkę” klawiatury, zniknięcie, a następnie natychmiastowe pojawienie się. Lekko zmieniłem jego wersję, aby pominąć resignFirstResponder, jeśli dostępne jest pole nextField.
źródło