Ich mache eine Anwendung, die a verwendet UITextView
. Jetzt möchte ich, dass die Textansicht einen Platzhalter hat, der dem ähnlich ist, den Sie für ein Textfeld festlegen können. Wie würden Sie dies mit Swift erreichen?
ios
swift
uitextview
placeholder
StevenR
quelle
quelle
Antworten:
Aktualisiert für Swift 4
UITextView
hat von Natur aus keine Platzhalter-Eigenschaft, daher müssten Sie eine programmgesteuert mithilfe vonUITextViewDelegate
Methoden erstellen und bearbeiten . Ich empfehle, je nach gewünschtem Verhalten entweder die Lösung Nr. 1 oder Nr. 2 zu verwenden.Hinweis: Fügen Sie für beide Lösungen
UITextViewDelegate
der Klasse hinzu und legen Sie festtextView.delegate = self
, dass die Delegatmethoden der Textansicht verwendet werden sollen.Lösung 1 - Wenn der Platzhalter verschwinden soll, sobald der Benutzer die Textansicht auswählt:
Stellen Sie zuerst das so ein
UITextView
, dass es den Platzhaltertext enthält, und setzen Sie es auf eine hellgraue Farbe, um das Aussehen desUITextField
Platzhaltertextes eines zu imitieren . Entweder in derviewDidLoad
oder bei der Erstellung der Textansicht.Wenn der Benutzer mit der Bearbeitung der Textansicht beginnt und die Textansicht einen Platzhalter enthält (dh wenn seine Textfarbe hellgrau ist), löschen Sie den Platzhaltertext und setzen Sie die Textfarbe auf Schwarz, um die Eingabe des Benutzers zu berücksichtigen.
Wenn der Benutzer die Bearbeitung der Textansicht abgeschlossen hat und als Ersthelfer zurückgetreten ist und die Textansicht leer ist, setzen Sie den Platzhalter zurück, indem Sie den Platzhaltertext erneut hinzufügen und seine Farbe auf hellgrau setzen.
Lösung 2 - Wenn der Platzhalter angezeigt werden soll, wenn die Textansicht leer ist, auch wenn die Textansicht ausgewählt ist:
Setzen Sie zuerst den Platzhalter in
viewDidLoad
:(Hinweis: Da das OP wollte, dass die Textansicht ausgewählt wird, sobald die Ansicht geladen wird, habe ich die Auswahl der Textansicht in den obigen Code aufgenommen. Wenn dies nicht Ihr gewünschtes Verhalten ist und Sie nicht möchten, dass die Textansicht beim Laden der Ansicht ausgewählt wird, Entfernen Sie die letzten beiden Zeilen aus dem obigen Codeblock.)
Verwenden Sie dann die
shouldChangeTextInRange
UITextViewDelegate
Methode wie folgt:Und implementieren Sie auch, um
textViewDidChangeSelection
zu verhindern, dass der Benutzer die Position des Cursors ändert, während der Platzhalter sichtbar ist. (Hinweis:textViewDidChangeSelection
Wird aufgerufen, bevor die Ansicht geladen wird. Überprüfen Sie daher die Farbe der Textansicht nur, wenn das Fenster sichtbar ist.)quelle
yourTextField.delegate = self
. Wenn Sie dies nicht tun, funktionierentextViewDidBeginEditing
dietextViewDidEndEditing
Funktionen und nicht.Cannot convert value of type 'NSRange' (aka '_NSRange') to expected argument type 'Range<String.Index>' (aka 'Range<String.CharacterView.Index>')
.let currentText = textView.text as NSString?
. Transformiere dielet updatedText =
Linie inlet updatedText = currentText?.replacingCharacters(in: range, with: text)
. Zum Schluss transformieren Sie dieif updatedText.isEmpty
Linie inif (updatedText?.isEmpty)! {
. Das sollte den Trick machen!textView.selectedTextRange
von innenfunc textViewDidChangeSelection(_ textView: UITextView)
verursacht eine Endlosschleife ...Schwimmender Platzhalter
Es ist einfach, sicher und zuverlässig, eine Platzhalterbezeichnung über einer Textansicht zu positionieren, Schriftart und Farbe festzulegen und die Sichtbarkeit von Platzhaltern zu verwalten, indem Änderungen an der Zeichenanzahl der Textansicht verfolgt werden.
Swift 3:
Swift 2: Gleiche, ausgenommen
italicSystemFontOfSize(textView.font.pointSize)
,UIColor.lightGrayColor
quelle
Es wird dringend empfohlen, die KMPlaceholderTextView- Bibliothek zu verwenden. Sehr einfach zu bedienen.
quelle
Schnell:
Fügen Sie Ihre Textansicht programmgesteuert oder über den Interface Builder hinzu. Wenn dies der letzte ist, erstellen Sie den Ausgang:
Bitte fügen Sie den Delegaten (UITextViewDelegate) hinzu:
Fügen Sie in der viewDidLoad-Methode Folgendes hinzu:
Lassen Sie mich nun den magischen Teil vorstellen und diese Funktion hinzufügen:
Beachten Sie, dass dies immer dann ausgeführt wird, wenn die Bearbeitung beginnt. Dort überprüfen wir die Bedingungen, um den Status mithilfe der Farbeigenschaft zu ermitteln. Das Setzen von Text auf
nil
Ich empfehle nicht. Gleich danach setzen wir die Textfarbe auf die gewünschte, in diesem Fall Schwarz.Fügen Sie nun auch diese Funktion hinzu:
Lassen Sie mich darauf bestehen, nicht zu vergleichen
nil
, ich habe das bereits versucht und es würde nicht funktionieren. Anschließend setzen wir die Werte wieder auf den Platzhalterstil und die Farbe wieder auf die Platzhalterfarbe, da dies eine Bedingung zum Einchecken isttextViewDidBeginEditing
.quelle
Verwenden Sie diese Erweiterung. Dies ist der beste Weg, um Platzhalter in UITextView festzulegen. Stellen Sie jedoch sicher, dass Sie Delegierte an die Textansicht angehängt haben. Sie können den Platzhalter wie folgt einstellen: -
quelle
Ich bin überrascht, dass niemand erwähnt hat
NSTextStorageDelegate
.UITextViewDelegate
Die Methoden werden nur durch Benutzerinteraktion ausgelöst, nicht jedoch programmgesteuert. Wenn Sie beispielsweise dietext
Eigenschaft einer Textansicht programmgesteuert festlegen, müssen Sie die Sichtbarkeit des Platzhalters selbst festlegen, da die Delegatmethoden nicht aufgerufen werden.Doch mit
NSTextStorageDelegate
‚s -textStorage(_:didProcessEditing:range:changeInLength:)
Methode, werden Sie auf den Text über jede Änderung informiert werden, auch wenn es programmatisch fertig ist. Weisen Sie es einfach so zu:(In
UITextView
ist diese Delegate-Eigenschaftnil
standardmäßig, sodass sie kein Standardverhalten beeinflusst.)Kombinieren Sie es mit der
UILabel
Technik @clearlight zeigt, kann man leicht die ganze wickelnUITextView
‚splaceholder
Implementierung in eine Verlängerung.Beachten Sie, dass die Verwendung einer privaten (verschachtelten) Klasse aufgerufen wird
PlaceholderLabel
. Es gibt überhaupt keine Implementierung, aber es bietet uns eine Möglichkeit, die Platzhalterbezeichnung zu identifizieren, die weitaus schneller ist als die Verwendung dertag
Eigenschaft.Mit diesem Ansatz können Sie den Delegaten von weiterhin
UITextView
einer anderen Person zuweisen .Sie müssen nicht einmal die Klassen Ihrer Textansichten ändern. Fügen Sie einfach die Erweiterung (en) hinzu, und Sie können jedem
UITextView
in Ihrem Projekt eine Platzhalterzeichenfolge zuweisen , auch im Interface Builder.Ich habe die Implementierung einer
placeholderColor
Eigenschaft aus Gründen der Klarheit weggelassen, aber sie kann nur für ein paar weitere Zeilen mit einer ähnlichen berechneten Variablen wie implementiert werdenplaceholder
.quelle
textView.textStorage.delegate = self
Dies erfordert in einem View-Controller, dass wir diesen View-Controller mit bindenNSTextStorageDelegate
. Es ist wirklich erforderlich?NSTextStorageDelegate
, nicht der View Controller.Ich habe dazu zwei verschiedene Textansichten verwendet:
Die Idee ist, dass der Platzhalter im Hintergrund verschwindet (und wieder angezeigt wird, wenn der Benutzer alles löscht), sobald der Benutzer mit der Eingabe von Inhalten in der Vordergrundansicht beginnt. Es verhält sich also genau wie ein Platzhalter für das einzeilige Textfeld.
Hier ist der Code, den ich dafür verwendet habe. Beachten Sie, dass descriptionField das Feld ist, in das der Benutzer eingibt, und descriptionPlaceholder das Feld im Hintergrund ist.
quelle
Aufgrund einiger der großartigen Vorschläge hier konnte ich die folgende leichte, Interface-Builder-kompatible Unterklasse zusammenstellen, von
UITextView
der:UITextField
.text
Feldeigenschaft betrachten.Verbesserungsvorschläge sind willkommen, insbesondere wenn es eine Möglichkeit gibt, die Platzhalterfarbe von iOS programmgesteuert abzurufen, anstatt sie fest zu codieren.
Swift v5:
quelle
SET-Wert beim Laden der Ansicht
quelle
Ich habe versucht, den Code anhand der Antwort von clearlight zu vereinfachen .
Verwendungszweck
quelle
Eine weitere Lösung (Swift 3):
Ergebnis
quelle
Eine einfache und schnelle Lösung, die für mich funktioniert, ist:
quelle
Hier ist, was ich für diesen Job benutze.
Ich weiß, dass es mehrere ähnliche Ansätze gibt, aber die Vorteile dieses Ansatzes sind:
quelle
Swift 3.2
Wenn der Benutzer mit der Bearbeitung des Aufrufs textViewDidBeginEditing beginnt und dann überprüft, ob die Farbe von Textgrau bedeutet, dass der Benutzer nichts geschrieben hat, setzen Sie die Textansicht auf Null und ändern Sie die Farbe für die SMS des Benutzers in Schwarz.
Wenn der Benutzer die Bearbeitung von textViewDidEndEditing beendet und aufruft und prüft, ob der Benutzer nichts in die Textansicht schreibt, wird der Text als graue Farbe mit dem Text "PlaceHolder" festgelegt.
quelle
Hier ist meine Art, dieses Problem zu lösen ( Swift 4 ):
Die Idee war, eine möglichst einfache Lösung zu finden, die es ermöglicht, Platzhalter in verschiedenen Farben zu verwenden, die Größe auf Platzhaltergröße zu ändern und nicht zu überschreiben, während
delegate
alleUITextView
Funktionen wie erwartet funktionieren.quelle
Ich weiß nicht, warum die Leute dieses Problem so sehr komplizieren ... Es ist ziemlich einfach und unkompliziert. Hier ist eine Unterklasse von UITextView, die die angeforderte Funktionalität bereitstellt.
quelle
Dies ist meine gebrauchsfertige Lösung, wenn Sie mit mehreren Textansichten arbeiten
quelle
Swift 3.1
Diese Erweiterung hat bei mir gut funktioniert: https://github.com/devxoul/UITextView-Placeholder
Hier ist ein Code-Snippet:
Installieren Sie es über Pod:
Importieren Sie es in Ihre Klasse
Und fügen Sie
placeholder
Ihrem bereits erstellten Objekt eine Eigenschaft hinzuUITextView
Das ist es ... Hier, wie es aussieht (dritte Box ist a
UITextView
)quelle
Im Gegensatz zu fast jeder Antwort auf dieses Thema liegt ,
UITextView
hat einen Platzhalter Eigenschaft. Aus Gründen, die ich nicht verstehe, wird es nur in IB als solches angezeigt:Wenn Sie also Storyboards verwenden und ein statischer Platzhalter ausreicht, legen Sie die Eigenschaft einfach im Inspektor fest.
Sie können diese Eigenschaft auch im folgenden Code festlegen:
Seine trübe , da dies Wetter über private API zugegriffen wird , wie die Eigenschaft wird ausgesetzt.
Ich habe nicht versucht, mit dieser Methode einzureichen. Aber ich werde diesen Weg in Kürze einreichen und diese Antwort entsprechend aktualisieren.
AKTUALISIEREN:
Ich habe diesen Code in mehreren Versionen ohne Probleme von Apple ausgeliefert.
UPDATE: Dies funktioniert nur in Xcode vor 11.2
quelle
UITextField
NICHTUITextView
Bitte lesen Sie die Fragen / Antworten genauer durch.In ios gibt es keine solche Eigenschaft, um Platzhalter direkt in TextView hinzuzufügen. Sie können stattdessen eine Beschriftung hinzufügen und die Änderung in textView ein- / ausblenden. SWIFT 2.0 und stellen Sie sicher, dass Sie das textviewdelegate implementieren
quelle
Swift - Ich habe eine Klasse geschrieben, die UITextView geerbt hat, und ein UILabel als Unteransicht hinzugefügt, um als Platzhalter zu fungieren.
quelle
Ich mag die Lösung von @ nerdist. Auf dieser Grundlage habe ich eine Erweiterung erstellt für
UITextView
:In einer ViewController-Klasse verwende ich sie beispielsweise folgendermaßen:
Platzhalter auf UITextview!
UPDATE :
Wenn Sie den Text der Textansicht im Code ändern, denken Sie daran, die updateVisibitly-Methode aufzurufen, um Platzhalter auszublenden:
Um zu verhindern, dass der Platzhalter mehrmals hinzugefügt wird, wird eine private
add()
Funktion hinzugefügtextension
.quelle
In swift2.2:
}}
In swift3:
Klasse CustomTextView: UITextView {
}}
Ich habe schnell eine Klasse geschrieben. Sie müssen diese Klasse bei Bedarf importieren.
quelle
Ich kann wegen des guten Rufs keinen Kommentar hinzufügen. Fügen Sie in @clearlight answer einen weiteren Delegiertenbedarf hinzu.
ist notwendig
weil
textViewDidChange
wird nicht beim ersten mal aufgerufenquelle
Nein, für die Textansicht ist kein Platzhalter verfügbar. Sie müssen eine Beschriftung darüber setzen, wenn der Benutzer in die Textansicht eingibt, diese dann ausblenden oder als Standardwert festlegen, wenn der Benutzer alle Werte entfernt.
quelle
quelle
Ich musste die Warteschlange absenden, damit mein Platzhaltertext nach Abschluss der Bearbeitung wieder angezeigt wurde.
quelle
Schnell:
Fügen Sie hinzu
TextView
@IBOutlet
:Fügen Sie in der
viewWillAppear
Methode Folgendes hinzu:Bitte fügen Sie die
Delegate
Using-Erweiterung (UITextViewDelegate) hinzu:quelle
Unsere Lösung vermeidet das Durcheinander mit den Eigenschaften
UITextView
text
undtextColor
, was praktisch ist, wenn Sie einen Zeichenzähler pflegen.Es ist einfach:
1) Erstellen Sie
UITextView
im Storyboard einen Dummy mit denselben Eigenschaften wie der MasterUITextView
. Weisen Sie dem Dummy-Text Platzhaltertext zu.2) Richten Sie den oberen, linken und rechten Rand der beiden aus
UITextViews.
3) Platzieren Sie den Dummy hinter dem Master.
4) Überschreiben Sie die
textViewDidChange(textView:)
Delegatenfunktion des Masters und zeigen Sie den Dummy an, wenn der Master 0 Zeichen hat. Andernfalls zeigen Sie den Master.Dies setzt voraus, dass beide
UITextViews
transparente Hintergründe haben. Wenn dies nicht der Fall ist, platzieren Sie den Dummy oben, wenn 0 Zeichen vorhanden sind, und schieben Sie ihn darunter, wenn> 0 Zeichen vorhanden sind. Sie müssen auch die Responder austauschen, um sicherzustellen, dass der Cursor nach rechts folgtUITextView
.quelle
Swift 4, 4.2 und 5
quelle