Es ist trivial, Hyperlinks in a anklickbar zu machen UITextView
. Sie haben einfach das Kontrollkästchen "Links erkennen" in der Ansicht in IB aktiviert. Es erkennt HTTP-Links und wandelt sie in Hyperlinks um.
Dies bedeutet jedoch immer noch, dass der Benutzer den "rohen" Link sieht. Mit RTF-Dateien und HTML können Sie eine vom Benutzer lesbare Zeichenfolge mit einem Link "dahinter" einrichten.
Es ist einfach, zugeordneten Text in eine Textansicht (oder ein UILabel
oder) zu installieren UITextField
. Wenn dieser zugeordnete Text jedoch einen Link enthält, kann er nicht angeklickt werden.
Gibt es eine Möglichkeit der Benutzer lesbaren Text anklickbar in einem zu machen UITextView
, UILabel
oder UITextField
?
Das Markup ist bei SO anders, aber hier ist die allgemeine Idee. Was ich will, ist Text wie folgt:
Dieser Morph wurde mit Face Dancer erstellt . Klicken Sie hier, um ihn im App Store anzuzeigen.
Das einzige was ich bekommen kann ist folgendes:
Dieser Morph wurde mit Face Dancer erstellt. Klicken Sie auf http://example.com/facedancer , um ihn im App Store anzuzeigen.
quelle
Antworten:
Verwenden Sie NSMutableAttributedString .
Bearbeiten :
Hier geht es nicht direkt um die Frage, sondern nur zur Verdeutlichung,
UITextField
undUILabel
das Öffnen von URLs wird nicht unterstützt. Wenn SieUILabel
mit Links verwenden möchten, können Sie TTTAttributedLabel überprüfen .Auch sollten Sie festlegen
dataDetectorTypes
Wert IhrerUITextView
anUIDataDetectorTypeLink
oderUIDataDetectorTypeAll
auf URLs öffnen , wenn darauf geklickt. Oder Sie können die Delegatmethode verwenden, wie in den Kommentaren vorgeschlagen.quelle
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
NSURL
. ----[str addAttribute: NSLinkAttributeName value: [NSURL URLWithString:@"http://www.google.com"] range: NSMakeRange(0, str.length)];
NSAttributedString.h
UIKIT_EXTERN NSString * const NSLinkAttributeName NS_AVAILABLE(10_0, 7_0); // NSURL (preferred) or NSString
Ich fand das wirklich nützlich, aber ich musste es an einigen Stellen tun, also habe ich meinen Ansatz in einer einfachen Erweiterung zusammengefasst, um
NSMutableAttributedString
:Swift 3
Swift 2
Anwendungsbeispiel:
Ziel c
Ich habe gerade die Anforderung erfüllt, dasselbe in einem reinen Objective-C-Projekt zu tun. Hier ist also die Objective-C-Kategorie.
Anwendungsbeispiel:
Stellen Sie sicher, dass das Verhaltensattribut von NSTextField als auswählbar festgelegt ist.
quelle
Ich habe gerade eine Unterklasse von UILabel erstellt, um solche Anwendungsfälle speziell zu behandeln. Sie können einfach mehrere Links hinzufügen und verschiedene Handler für sie definieren. Es unterstützt auch das Hervorheben des gedrückten Links, wenn Sie für Touch-Feedback aufsetzen. Weitere Informationen finden Sie unter https://github.com/null09264/FRHyperLabel .
In Ihrem Fall könnte der Code folgendermaßen aussehen:
Beispiel-Screenshot (der Handler ist so eingestellt, dass in diesem Fall eine Warnung angezeigt wird, anstatt eine URL zu öffnen)
quelle
- (void)setLinkForRange:(NSRange)range withLinkHandler:(void(^)(FRHyperLabel *label, NSRange selectedRange))handler;
stattdessen die API . Bitte beachten Sie die Readme-Datei auf der Github-Seite.Kleinere Verbesserung der Lösung von ujell: Wenn Sie NSURL anstelle eines NSString verwenden, können Sie eine beliebige URL verwenden (z. B. benutzerdefinierte URLs).
Habe Spaß!
quelle
Swift 4:
Swift 3.1:
quelle
Auch ich hatte eine ähnliche Anforderung, zuerst habe ich UILabel verwendet und dann festgestellt, dass UITextView besser ist. Ich habe dafür gesorgt, dass sich UITextView wie UILabel verhält, indem ich die Interaktion und das Scrollen deaktiviert habe, und eine Kategoriemethode erstellt, um
NSMutableAttributedString
den Link zu Text so zu setzen, wie Karl es getan hat (+1 dafür). Dies ist meine ObjektversionSie können dann den folgenden Delegaten verwenden, um die Aktion auszuführen
quelle
NSForegroundColorAttributeName
in einem Bereich, in dem sieNSLinkAttributeName
angewendet wird, nicht. Egal was passiert, dielinkTextAttributes
vonUITextView
werden stattdessen angewendet. FunktioniertNSForegroundColorAttributeName
für Sie?linkTextAttributes
auf dasselbe einstellen ? oder vielleichttintColor
? Können Sie 2 Links in verschiedenen Farben in derselben Textansicht anzeigen lassen?Verwenden Sie UITextView, um anklickbare Links zu unterstützen. Erstellen Sie eine zugeordnete Zeichenfolge mit dem folgenden Code
Stellen Sie dann den UITextView-Text wie folgt ein
Stellen Sie sicher, dass Sie das Verhalten "Auswählbar" der UITextView in XIB aktivieren.
quelle
Selectable
ist wichtig!Das Herzstück meiner Frage war, dass ich anklickbare Links in Textansichten / Feldern / Beschriftungen erstellen wollte, ohne benutzerdefinierten Code schreiben zu müssen, um den Text zu bearbeiten und die Links hinzuzufügen. Ich wollte, dass es datengesteuert ist.
Ich habe endlich herausgefunden, wie es geht. Das Problem ist, dass IB eingebettete Links nicht berücksichtigt.
Darüber hinaus können Sie in der iOS-Version von
NSAttributedString
keine zugewiesene Zeichenfolge aus einer RTF-Datei initialisieren. Die OS X-Version vonNSAttributedString
verfügt über einen Initialisierer, der eine RTF-Datei als Eingabe verwendet.NSAttributedString
Entspricht dem NSCoding-Protokoll, sodass Sie es in / aus NSData konvertieren könnenIch habe ein OS X-Befehlszeilentool erstellt, das eine RTF-Datei als Eingabe verwendet und eine Datei mit der Erweiterung .data ausgibt, die die NSData von NSCoding enthält. Ich füge dann die .data-Datei in mein Projekt ein und füge ein paar Codezeilen hinzu, die den Text in die Ansicht laden. Der Code sieht folgendermaßen aus (dieses Projekt war in Swift):
Für Apps, die viel formatierten Text verwenden, erstelle ich eine Erstellungsregel, die Xcode mitteilt, dass alle RTF-Dateien in einem bestimmten Ordner Quell- und die DATA-Dateien die Ausgabe sind. Sobald ich das getan habe, füge ich einfach RTF-Dateien zum angegebenen Verzeichnis hinzu (oder bearbeite vorhandene Dateien), und der Erstellungsprozess stellt fest, dass sie neu / aktualisiert sind, führt das Befehlszeilentool aus und kopiert die Dateien in das App-Bundle. Es funktioniert wunderbar.
Ich habe einen Blog-Beitrag geschrieben, der auf ein Beispielprojekt (Swift) verweist, das die Technik demonstriert. Sie können es hier sehen:
Erstellen anklickbarer URLs in einem UITextField, die in Ihrer App geöffnet werden
quelle
Swift 3-Beispiel zum Erkennen von Aktionen auf zugewiesenen Textabgriffen
https://stackoverflow.com/a/44226491/5516830
Ebenso können Sie mit der
shouldInteractWith URL
UITextFieldDelegate-Methode jede gewünschte Aktion hinzufügen.Prost!!
quelle
Die schnelle Antwort lautet UITextView anstelle von UILabel. Sie müssen aktivieren
Selectable
und deaktivierenEditable
.Deaktivieren Sie dann die Bildlaufanzeigen und Bounces.
Meine Lösung mit
NSMutableAttributedString
HTML-ZeichenfolgeNSHTMLTextDocumentType
quelle
NSAttributedString
, alsattributedText
meine festlegenUITextView
und die Hyperlinks funktionieren einfach! Es wäre eine Menge Arbeit gewesen, den Bereich jedes Hyperlinks zu finden und ihn mithilfe von Attributen einzurichten.Ich habe eine Methode geschrieben, die einem String (fullString) einen Link (linkString) mit einer bestimmten URL (urlString) hinzufügt:
Sie sollten es so nennen:
quelle
Ich musste weiterhin ein reines UILabel verwenden, das von meinem Tap-Erkenner so genannt wurde (dies basiert auf der Antwort von Malex hier: Zeichenindex am Berührungspunkt für UILabel )
quelle
Aktualisieren:
Meine Frage bestand aus zwei Hauptteilen:
Es stellt sich heraus, dass iOS 7 die Möglichkeit hinzugefügt hat, zugeordneten Text von zu laden
NSData
.Ich habe eine benutzerdefinierte Unterklasse erstellt
UITextView
, die die Vorteile von nutzt@IBInspectable
Attribut und es Ihnen ermöglicht, Inhalte aus einer RTF-Datei direkt in IB zu laden. Sie geben einfach den Dateinamen in IB ein und die benutzerdefinierte Klasse erledigt den Rest.Hier sind die Details:
In iOS 7
NSAttributedString
erlangte die MethodeinitWithData:options:documentAttributes:error:
. Mit dieser Methode können Sie einen NSAttributedString aus einem NSData-Objekt laden. Sie können zuerst eine RTF-Datei in NSData laden und danninitWithData:options:documentAttributes:error:
diese NSData in Ihre Textansicht laden. (Beachten Sie, dass es auch eine Methode gibtinitWithFileURL:options:documentAttributes:error:
, die eine zugewiesene Zeichenfolge direkt aus einer Datei lädt. Diese Methode wurde jedoch in iOS 9 nicht mehr unterstützt. Es ist sicherer, die Methode zu verwendeninitWithData:options:documentAttributes:error:
, die nicht veraltet war.Ich wollte eine Methode, mit der ich anklickbare Links in meine Textansichten installieren kann, ohne Code für die von mir verwendeten Links erstellen zu müssen.
Die Lösung bestand darin, eine benutzerdefinierte Unterklasse von UITextView zu erstellen, die ich aufrufe,
RTF_UITextView
und ihr eine@IBInspectable
Eigenschaft mit dem Namen zu gebenRTF_Filename
. Durch Hinzufügen des@IBInspectable
Attributs zu einer Eigenschaft wird diese Eigenschaft im Interface Builder im "Attributes Inspector" verfügbar gemacht. Sie können diesen Wert dann über IB ohne benutzerdefinierten Code festlegen.Ich
@IBDesignable
habe meiner benutzerdefinierten Klasse auch ein Attribut hinzugefügt . Das@IBDesignable
Attribut teilt Xcode mit, dass eine laufende Kopie Ihrer benutzerdefinierten Ansichtsklasse im Interface Builder installiert werden soll, damit Sie sie in der grafischen Anzeige Ihrer Ansichtshierarchie sehen können. () Leider@IBDesignable
scheint die Eigenschaft für diese Klasse schuppig zu sein. Es hat funktioniert, als ich es zum ersten Mal hinzugefügt habe, aber dann habe ich den Nur-Text-Inhalt meiner Textansicht gelöscht und die anklickbaren Links in meiner Ansicht sind verschwunden und ich konnte sie nicht zurückbekommen.)Der Code für meine
RTF_UITextView
ist sehr einfach. Zusätzlich zum Hinzufügen des@IBDesignable
Attributs und einerRTF_Filename
Eigenschaft mit dem@IBInspectable
Attribut habe ichdidSet()
derRTF_Filename
Eigenschaft eine Methode hinzugefügt . DiedidSet()
Methode wird jedes Mal aufgerufen, wenn sich der Wert derRTF_Filename
Eigenschaft ändert. Der Code für diedidSet()
Methode ist recht einfach:Beachten Sie, dass es möglicherweise besser ist, den obigen Code als Erweiterung von UITextView als als benutzerdefinierte Unterklasse einzurichten, wenn Sie mit der Eigenschaft @IBDesignable nicht zuverlässig eine Vorschau Ihres gestalteten Textes im Interface Builder anzeigen können. Auf diese Weise können Sie es in jeder Textansicht verwenden, ohne die Textansicht in die benutzerdefinierte Klasse ändern zu müssen.
Siehe meine andere Antwort, wenn Sie iOS-Versionen vor iOS 7 unterstützen müssen.
Sie können ein Beispielprojekt mit dieser neuen Klasse von gitHub herunterladen:
DatesInSwift-Demo-Projekt auf Github
quelle
Finden Sie einfach eine codefreie Lösung für UITextView:
Aktivieren Sie die Optionen Erkennung-> Links. Die URL und auch die E-Mail werden erkannt und können angeklickt werden.
quelle
Schnelle Version:
quelle
Verwenden Sie UITextView und legen Sie dataDetectorTypes für Link fest.
so was:
Wenn Sie Link, Telefonnummer, Adresse usw. erkennen möchten, dann
quelle
http://somedomain/someurl?param=value
Eine schnelle Ergänzung zu Duncan Cs ursprünglicher Beschreibung des IB-Verhaltens. Er schreibt: "Es ist trivial, Hyperlinks in einer UITextView anklickbar zu machen. Sie setzen einfach das Kontrollkästchen" Links erkennen "in der Ansicht in IB, und es erkennt http-Links und wandelt sie in Hyperlinks um."
Ich habe die Erfahrung gemacht (zumindest in xcode 7), dass Sie auch das Verhalten "Bearbeitbar" deaktivieren müssen, damit die URLs erkannt und angeklickt werden können.
quelle
Falls Sie Probleme mit dem haben, was @Karl Nosworthy und @esilver oben angegeben haben, habe ich die Erweiterung NSMutableAttributedString auf die Swift 4-Version aktualisiert.
quelle
Die hervorragende Bibliothek von @AliSoftware
OHAttributedStringAdditions
erleichtert das Hinzufügen von Links.UILabel
Hier finden Sie die Dokumentation: https://github.com/AliSoftware/OHAttributedStringAdditions/wiki/link-in-UILabelquelle
Wenn Sie den NSLinkAttributeName in einer UITextView verwenden möchten, können Sie die AttributedTextView-Bibliothek verwenden. Es ist eine UITextView-Unterklasse, die es sehr einfach macht, mit diesen umzugehen. Weitere Informationen finden Sie unter: https://github.com/evermeer/AttributedTextView
Sie können jeden Teil des Textes wie folgt interagieren lassen (wobei textView1 ein UITextView-IBoutlet ist):
Und für den Umgang mit Hashtags und Erwähnungen können Sie folgenden Code verwenden:
quelle
Wenn Sie eine aktive Teilzeichenfolge in Ihrer UITextView wünschen, können Sie meine erweiterte TextView verwenden ... sie ist kurz und einfach. Sie können es bearbeiten, wie Sie möchten.
Ergebnis:
Code: https://github.com/marekmand/ActiveSubstringTextView
quelle
WICHTIGE PUNKTE:
quelle