Wie kann ich mit der Schaltfläche "Weiter" auf der iPhone-Tastatur durch alle meine Textfelder navigieren?
Das letzte Textfeld sollte die Tastatur schließen.
Ich habe die IB the Buttons (Weiter / Fertig) eingerichtet, aber jetzt stecke ich fest.
Ich habe die Aktion textFieldShouldReturn implementiert, aber jetzt schließen die Schaltflächen Weiter und Fertig die Tastatur.
ios
objective-c
iphone
phx
quelle
quelle
Antworten:
In Cocoa für Mac OS X haben Sie die nächste Responderkette, in der Sie das Textfeld fragen können, auf welches Steuerelement sich der Fokus als Nächstes konzentrieren soll. So funktioniert das Tabulieren zwischen Textfeldern. Da iOS-Geräte jedoch keine Tastatur und nur eine Berührung haben, hat dieses Konzept den Übergang zu Cocoa Touch nicht überstanden.
Dies kann ohnehin leicht gemacht werden, mit zwei Annahmen:
UITextField
befinden sich in derselben übergeordneten Ansicht.Angenommen, Sie können textFieldShouldReturn überschreiben: wie folgt:
Fügen Sie etwas mehr Code hinzu, und die Annahmen können ebenfalls ignoriert werden.
Swift 4.0
Wenn die Übersicht des Textfelds eine UITableViewCell ist, ist dies der nächste Antwortende
quelle
UITableViewCell
. Sie müssten auf die zugehörigeUITableView
Zelle zugreifen und die Zelle mit dem gesuchten Textfeld abrufen.UITextFieldDelegate
die Textfelddelegierten hinzuzufügen und festzulegen.Es gibt eine viel elegantere Lösung, die mich beim ersten Mal umgehauen hat. Leistungen:
UITextField
und zu arbeitenUITextView
Steuerelementen zu arbeiten - oder mit jedem Steuerelement für die Benutzeroberfläche von TastatureingabenErstellen Sie eine UITextField-Unterklasse mit einer
IBOutlet
Eigenschaft namens nextField. Hier ist der Header:Und hier ist die Implementierung:
In Ihrem View Controller erstellen Sie die
-textFieldShouldReturn:
Delegate-Methode:Ändern Sie in IB Ihre UITextFields, um die
SOTextField
Klasse zu verwenden. Legen Sie als Nächstes auch in IB den Delegaten für jeden 'SOTextFields'to'-Dateibesitzer' fest (genau dort, wo Sie den Code für die Delegatenmethode eingeben - textFieldShouldReturn). Das Schöne an diesem Design ist, dass Sie jetzt einfach mit der rechten Maustaste auf ein beliebiges Textfeld klicken und dem nächstenSOTextField
Objekt, für das Sie der nächste Antwortende sein möchten , den nextField-Ausgang zuweisen können .Darüber hinaus können Sie coole Dinge tun, z. B. die textFields schleifen, sodass der erste wieder den Fokus erhält, nachdem der letzte den Fokus verloren hat.
Dies kann leicht erweitert werden , um automatisch das zuweisen
returnKeyType
derSOTextField
zu einem ,UIReturnKeyNext
wenn es eine Nextfield zugeordnet ist - eine Sache weniger, manuell konfiguriert.quelle
UITableView
. Obwohl ichIBOutlet
auf dem Ansichtscontroller Eigenschaften für jedes Textfeld habe, kann ich dienextField
Eigenschaft nicht mit diesen Eigenschaften im Eigentümer der Datei verknüpfen . Irgendwelche Ratschläge, wie ich es in diesem Szenario zum Laufen bringen kann?textField1.nextField = textField2; textField2.nextField = textField3;
usw.Hier ist eine ohne Delegation:
Objekt:
Funktioniert mit der (meist unbekannten)
UIControlEventEditingDidEndOnExit
UITextField
Aktion.Sie können dies auch einfach in das Storyboard einbinden, sodass keine Delegierung oder Code erforderlich ist.
Bearbeiten: Eigentlich kann ich nicht herausfinden, wie ich das in das Storyboard einbinden kann.
becomeFirstResponder
scheint keine angebotene Aktion für dieses Kontrollereignis zu sein, was schade ist. Trotzdem können Sie alle Ihre Textfelder mit einer einzigen Aktion in Ihrem ViewController verknüpfen, die dannbecomeFirstResponder
basierend auf dem Absender bestimmt, welches Textfeld verwendet werden soll (obwohl es dann nicht so elegant ist wie die obige programmatische Lösung, also macht IMO es mit dem obigen Code inviewDidLoad
).quelle
[tfN addTarget:self action:@selector(loginButtonTapped:) forControlEvents:UIControlEventEditingDidEndOnExit];
. Danke @mxcl.Hier ist meine Lösung für dieses Problem.
Um dies zu lösen (und weil ich es hasse, mich auf Tags zu verlassen), habe ich beschlossen, dem UITextField-Objekt eine benutzerdefinierte Eigenschaft hinzuzufügen. Mit anderen Worten, ich habe eine Kategorie auf UITextField wie folgt erstellt:
UITextField + Extended.h
UITextField + Extended.m
Hier ist, wie ich es benutze:
Und implementieren Sie die textFieldShouldReturn-Methode:
Ich habe jetzt eine Art verknüpfte Liste von UITextField, von denen jeder weiß, wer der nächste in der Zeile ist.
Hoffe es wird helfen.
quelle
Eine schnelle Erweiterung, die die Antwort von mxcl anwendet, um dies besonders einfach zu machen (angepasst an Swift 2.3 von Traveller):
Es ist einfach zu bedienen:
Die Erweiterung setzt die Eingabetaste für alle außer dem letzten Feld auf "Weiter" und für das letzte Feld auf "Fertig" und verschiebt den Fokus / schließt die Tastatur, wenn diese getippt werden.
Schnell <2.3
SWIFT 3: Verwenden Sie so -
quelle
UITextFieldDelegate
und implementieren lassenfunc textFieldDidEndEditing(textField: UITextField)
. Kommen Sie einfach früh raus, wenntextField != field3
.Eine konsistentere und robustere Methode ist die Verwendung von NextResponderTextField. Sie können es vollständig über den Interface Builder konfigurieren, ohne den Delegaten festlegen oder verwenden zu müssen
view.tag
.Alles was Sie tun müssen, ist
UITextField
einNextResponderTextField
nextResponderField
Stellen Sie dann den Ausgang des to so ein, dass er auf den nächsten Responder zeigt. Es kann sich um eineUITextField
beliebigeUIResponder
Unterklasse handeln. Es kann auch ein UIButton sein, und die Bibliothek ist intelligent genug, um dasTouchUpInside
Ereignis der Schaltfläche nur dann auszulösen, wenn sie aktiviert ist.Hier ist die Bibliothek in Aktion:
quelle
Ich mag die OO-Lösungen, die Anth0 und Answerbot bereits vorgeschlagen haben. Ich arbeitete jedoch an einem schnellen und kleinen POC, sodass ich die Dinge nicht mit Unterklassen und Kategorien überladen wollte.
Eine andere einfache Lösung besteht darin, ein NSArray von Feldern zu erstellen und das nächste Feld nachzuschlagen, wenn Sie auf Weiter klicken. 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):
quelle
Hier ist eine Implementierung des Tabulierens mithilfe einer Kategorie in UIControl. Diese Lösung bietet alle Vorteile der Methoden von Michael und Anth0, funktioniert jedoch für alle UIControls, nicht nur für
UITextField
s. Es funktioniert auch nahtlos mit Interface Builder und Storyboards.Quell- und Beispiel-App: GitHub-Repository für UIControlsWithTabbing
Verwendungszweck:
Header:
Implementierung:
quelle
Ich habe viele Codes ausprobiert und schließlich hat dies in Swift 3.0 Latest [März 2017] für mich funktioniert.
Die
ViewController
Klasse sollte geerbt werden,UITextFieldDelegate
damit dieser Code funktioniert.Fügen Sie das Textfeld mit der richtigen Tag-Nummer hinzu, und diese Tag-Nummer wird verwendet, um das Steuerelement basierend auf der ihm zugewiesenen inkrementellen Tag-Nummer zu einem geeigneten Textfeld zu führen.
Im obigen Code
returnKeyType = UIReturnKeyType.next
wird die Rückgabetaste des Tastenfelds angezeigt, daNext
Sie auch andere Optionen wieJoin/Go
usw. haben. Abhängig von Ihrer Anwendung ändern Sie die Werte.Dies
textFieldShouldReturn
ist eine Methode, die von UITextFieldDelegate gesteuert wird. Hier haben wir die nächste Feldauswahl basierend auf der Inkrementierung des Tag-Wertsquelle
UITextView
. Irgendeine Idee, wie man das in Kombination macht?UITextField
(einzelne Textzeile eingeben) und die andereUITextView
(mehrere Textzeilen eingeben).UITextView
reagiert offensichtlich nicht auf diesen Code, kann aber in Formularen verwendet werden.Nachdem Sie ein Textfeld verlassen haben, rufen Sie [otherTextField werden zum ersten Antwortgeber] auf und das nächste Feld wird fokussiert.
Dies kann tatsächlich ein schwieriges Problem sein, da Sie häufig auch den Bildschirm scrollen oder die Position des Textfelds auf andere Weise anpassen möchten, damit es beim Bearbeiten leicht erkennbar ist. Stellen Sie einfach sicher, dass Sie viele Tests durchführen, indem Sie auf unterschiedliche Weise in die Textfelder ein- und ausgehen und auch frühzeitig abreisen (geben Sie dem Benutzer immer die Möglichkeit, die Tastatur zu schließen, anstatt zum nächsten Feld zu wechseln, normalerweise mit "Fertig" die Navigationsleiste)
quelle
quelle
Eine sehr einfache Methode zum Schließen der Tastatur, wenn die Taste "Fertig" gedrückt wird, ist:
Erstellen Sie eine neue IBAction im Header
Fügen Sie in der Implementierungsdatei (.m-Datei) die folgende Methode hinzu:
Wenn Sie dann die IBAction mit dem Textfeld verknüpfen, verknüpfen Sie sie mit dem Ereignis "Did End On Exit".
quelle
Stellen Sie zuerst die Tastatur-Eingabetaste in xib ein, andernfalls können Sie Code schreiben in
viewdidload
:quelle
Ich bin überrascht, wie viele Antworten hier ein einfaches Konzept nicht verstehen: Das Navigieren durch Steuerelemente in Ihrer App sollte nicht von den Ansichten selbst ausgeführt werden. Es ist die Aufgabe des Controllers , zu entscheiden, welche Steuerung der nächste Ersthelfer sein soll.
Außerdem galten die meisten Antworten nur für das Vorwärtsnavigieren, aber Benutzer möchten möglicherweise auch rückwärts gehen.
Also hier ist, was ich mir ausgedacht habe. Ihr Formular sollte von einem View Controller verwaltet werden, und View Controller sind Teil der Responderkette. Sie können also die folgenden Methoden implementieren:
Möglicherweise gilt eine zusätzliche Logik zum Scrollen von zuvor sichtbaren Offscreen-Respondern.
Ein weiterer Vorteil dieses Ansatzes ist , dass Sie nicht alle Arten von Kontrollen , Unterklasse müssen Sie auf Display (wie möchten
UITextField
s) , sondern können stattdessen die Logik auf Controller - Ebene verwalten, wo, ehrlich lassen, ist der richtige Ort , dies zu tun, .quelle
Ich habe die Antwort von PeyloW hinzugefügt, falls Sie eine Funktion für vorherige / nächste Schaltflächen implementieren möchten:
Wo Sie die UIView wie folgt unterordnen:
quelle
Hallo an alle, bitte sehen Sie diesen
quelle
Ich habe versucht, dieses Problem mithilfe eines differenzierteren Ansatzes zu lösen, der darauf basiert, jeder Zelle (oder
UITextField
)UITableView
einen eindeutigen Tag-Wert zuzuweisen, der später abgerufen werden kann: zuzuweisen activate-next-uitextfield-in-uitableview-iosIch hoffe das hilft!
quelle
Ich habe gerade einen neuen Pod erstellt, wenn ich mich mit diesem Zeug beschäftige . GNTextFieldsCollectionManager . Es behandelt automatisch das nächste / letzte textField-Problem und ist sehr einfach zu bedienen:
Erfasst alle Textfelder, die nach Ansicht in der Ansichtshierarchie (oder nach Tags) sortiert sind, oder Sie können Ihr eigenes Array von Textfeldern angeben.
quelle
Lösung in Swift 3.1: Nachdem Sie Ihre Textfelder verbunden haben, legen IBOutlets Ihren Textfelddelegierten in viewDidLoad fest und navigieren dann in textFieldShouldReturn zu Ihrer Aktion
quelle
Wenn jemand so will. Ich denke, dies kommt den in Frage gestellten Anforderungen am nächsten
Hier ist, wie ich diesen implementiert habe
Fügen Sie für jedes Textfeld, für das Sie das Setup durchführen möchten, die Zusatzansicht hinzu
Verwenden Sie die folgenden Funktionen, um mit Wasserhähnen umzugehen
Sie müssen die textFields-Tags in der Reihenfolge angeben, in der die Schaltfläche next / prev antworten soll.
quelle
Ich bevorzuge lieber:
In der NIB-Datei hänge ich die textFields in der gewünschten Reihenfolge in dieses inputFields-Array ein. Danach mache ich einen einfachen Test für den Index des UITextField, der meldet, dass der Benutzer auf return getippt hat:
quelle
quelle
Ich hatte ungefähr 10+ UITextField in meinem Storyboard und die Art und Weise, wie ich die nächste Funktionalität aktivierte, bestand darin, ein Array von UITextField zu erstellen und das nächste UITextField zum ersten Antwortenden zu machen. Hier ist die Implementierungsdatei:
quelle
Dies funktionierte bei mir in Xamarin.iOS / Monotouch. Ändern Sie die Tastaturschaltfläche in Weiter, übergeben Sie das Steuerelement an das nächste UITextField und blenden Sie die Tastatur nach dem letzten UITextField aus.
In ViewDidLoad haben Sie:
Wenn Ihre TextFields kein Tag haben, legen Sie es jetzt fest:
und nur der Anruf
quelle
Dies ist eine einfache Lösung in Kürze, ohne Tag, ohne Storyboard-Tricks ...
Verwenden Sie einfach diese Erweiterung:
Und nennen Sie es (zum Beispiel) mit Ihrem Textfelddelegierten so:
quelle
Ein sicherer und direkterer Weg, vorausgesetzt:
Swift 4.1:
quelle
In textFieldShouldReturn sollten Sie überprüfen, ob das Textfeld, in dem Sie sich gerade befinden, nicht das letzte ist, wenn Sie auf Weiter klicken und wenn die Tastatur nicht geschlossen wird.
quelle
Dies ist ein alter Beitrag, der jedoch einen hohen Seitenrang hat, sodass ich mich meiner Lösung anschließen werde.
Ich hatte ein ähnliches Problem und erstellte schließlich eine Unterklasse von
UIToolbar
, um die nächste / vorherige / erledigte Funktionalität in einer dynamischen Tabellenansicht mit folgenden Abschnitten zu verwalten: https://github.com/jday001/DataEntryToolbarSie legen die Symbolleiste als inputAccessoryView Ihrer Textfelder fest und fügen sie dem Wörterbuch hinzu. Auf diese Weise können Sie sie auch bei dynamischen Inhalten vorwärts und rückwärts durchlaufen. Es gibt Delegate-Methoden, wenn Sie Ihre eigene Funktionalität auslösen möchten, wenn die textField-Navigation stattfindet, Sie sich jedoch nicht mit der Verwaltung von Tags oder dem Status eines Ersthelfers befassen müssen.
Unter dem GitHub-Link befinden sich Codefragmente und eine Beispiel-App, die bei den Implementierungsdetails helfen. Sie benötigen ein eigenes Datenmodell, um die Werte in den Feldern zu verfolgen.
quelle
Ohne Verwendung von Tags und ohne Hinzufügen einer Eigenschaft für nextField / nextTextField können Sie versuchen, TAB zu emulieren, wobei "testInput" Ihr aktuell aktives Feld ist:
quelle
Ich benutze die Antwort von Michael G. Emmons seit ungefähr einem Jahr und funktioniert großartig. Ich habe kürzlich bemerkt, dass das Aufrufen von resignFirstResponder und sofortigem Werden von FirstResponder dazu führen kann, dass die Tastatur "fehlerhaft" wird, verschwindet und sofort angezeigt wird. Ich habe seine Version leicht geändert, um den resignFirstResponder zu überspringen, wenn das nächste Feld verfügbar ist.
quelle