Wie kann ich einen link in einem NSAttributedString?
Es ist trivial, hyperlinks anklickbar in einer UITextView
. Sie stellen nur die "erkennen-links" - Kästchen auf der Ansicht in IB, und Sie erkennt die HTTP-links und verwandelt Sie in hyperlinks.
Jedoch, dass immer noch bedeutet, dass das, was der Benutzer sieht, ist die "raw" - link. RTF-Dateien und HTML können Sie festlegen, bis eine vom Benutzer lesbare Zeichenfolge mit einem link "dahinter".
Es ist einfach zu installieren zurückzuführen text in text-Ansicht (oder ein UILabel
oder UITextField
, für diese Angelegenheit.) Allerdings, wenn die zugeschriebenen text enthält einen link, ist es nicht anklickbar.
Ist es ein Weg, um Benutzer lesbaren text anklickbar in einer UITextView
, UILabel
oder UITextField
?
Das markup ist Verschieden SO, aber hier ist die Allgemeine Idee. Was ich möchte, ist ein text wie dieser:
Dieser morph wurde generiert mit Gesicht-Tänzerin, Klicken Sie, um in den app store.
Das einzige, was ich kann, ist dies:
Dieser morph wurde generiert mit Gesicht-Tänzerin, Klicken Sie auf http://example.com/facedancer anzeigen in den app store.
- Versuchen Sie diese sample.. IFTweetLabel Hoffe, es hilft..
- Möglich, Duplikat der Erstellen Tippen-können "links" in der NSAttributedText von UILabel?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden NSMutableAttributedString.
Bearbeiten:
Dies ist nicht direkt über die Frage, aber nur um zu klären,
UITextField
undUILabel
unterstützt nicht das öffnen von URLs. Wenn Sie verwenden möchtenUILabel
mit links, die Sie überprüfen können,TTTAttributedLabel.Ebenfalls sollten Sie
dataDetectorTypes
Wert IhrerUITextView
zuUIDataDetectorTypeLink
oderUIDataDetectorTypeAll
zu URLs öffnen, wenn geklickt wird. Oder können Sie delegieren-Methode, wie vorgeschlagen, in den Kommentaren.- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
UITextView
? dieser Fehler scheint, wie Sie haben eineUITextField
.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 hilfreich, aber ich musste es tun, in ganz wenigen Orten, so habe ich gewickelt mein Ansatz bis in eine einfache Erweiterung auf
NSMutableAttributedString
:Swift 3
Swift 2
Beispiel:
Objective-C
Habe ich einfach auf eine Anforderung zu tun, das gleiche in reinem Objective-C Projekt, so hier ist die Objective-C Klasse.
Beispiel:
Stellen Sie Sicher, dass die NSTextField ' s Verhalten-Attribut gesetzt ist Wählbar.
self.addAttribute(NSAttributedStringKey.link, value: linkURL, range: foundRange)
, andernfalls erhalten Sie eine "Use of unresolved identifier 'NSLinkAttributeName'"Ich gerade erstellt eine Unterklasse von UILabel zu speziell-Adresse solche Fälle. Sie können mehrere links leicht anders definieren und Prozeduren für Sie. Es unterstützt auch die Hervorhebung der link gedrückt, wenn Sie die touch down-für touch-feedback. Bitte https://github.com/null09264/FRHyperLabel.
In Ihrem Fall, kann der code wie dieser:
Beispiel-Screenshot (der handler pop eine Warnung statt öffnen einer url in diesem Fall)
- (void)setLinkForRange:(NSRange)range withLinkHandler:(void(^)(FRHyperLabel *label, NSRange selectedRange))handler;
statt. Bitte Lesen Sie die readme im github-Seite.Geringfügige Verbesserung zu ujell Lösung: Wenn Sie NSURL statt ein NSString, können Sie einen beliebigen URL (z.B. benutzerdefinierte urls)
Spaß haben!
Auch ich hatte eine ähnliche Anforderung, die ich anfangs verwendet UILabel und dann merkte ich, dass UITextView ist besser. Ich machte UITextView Verhalten sich wie UILabel, durch die Deaktivierung der Interaktion und scrollen und machte eine Kategorie-Methode für
NSMutableAttributedString
zu setzen, link auf text gleiche wie das, was Karl getan hatte (+1 für die) das ist mein obj-c versionkönnen Sie die unten delegieren, dann Griff die Aktion
NSForegroundColorAttributeName
in einem Bereich, woNSLinkAttributeName
angewendet wird, funktioniert nicht. Egal, was derlinkTextAttributes
desUITextView
angewendet werden, statt. TutNSForegroundColorAttributeName
für Sie arbeiten?linkTextAttributes
um die gleiche Sache? oder vielleichttintColor
? Sind Sie in der Lage zu machen, 2 links zeigen sich in verschiedenen Farben in der gleichen textview?Swift 4:
Swift 3.1:
Verwenden UITextView unterstützt es anklickbare Links.
Erstellen zugeschrieben string mit dem folgenden code
Legen Sie dann UITextView text wie folgt
Stellen Sie sicher, dass Sie aktivieren "Wählbar" Verhalten der UITextView im XIB.
Selectable
ist wichtig!Herzen meiner Frage war, dass ich wollte in der Lage sein zu erstellen, die anklickbare links im text-Ansichten/Felder/labels, ohne benutzerdefinierten code schreiben, der zu Bearbeiten den text und fügen Sie die links. Ich wollte, dass es Daten-getrieben.
Ich endlich herausgefunden, wie es zu tun. Das Problem ist, dass IB nicht Ehre eingebettete links.
Darüber hinaus die iOS-version von
NSAttributedString
lässt Sie nicht initialisieren zugeschrieben string aus einer RTF-Datei. Die OS X-version vonNSAttributedString
hat eine Initialisierung nimmt eine RTF-Datei als Eingabe.NSAttributedString
entspricht das NSCoding-Protokoll, so können Sie wandeln es in/aus NSDataErstellte ich eine OS X-Befehlszeile Werkzeug, mit dem eine RTF-Datei als Eingabe und gibt eine Datei mit der Erweiterung .Daten, enthält die NSData aus NSCoding. Ich lege dann die .Daten-Datei in mein Projekt und fügen Sie ein paar Zeilen code, lädt den text in den Blick. Der code sieht so aus (dieses Projekt wurde in Swift) :
Für apps, die eine Menge von formatierten text, den ich erstellen Sie eine build Regel, die sagt, Xcode, die alle .rtf-Dateien in einem bestimmten Ordner source und die .Daten-Dateien sind der output. Sobald ich tun, dass ich einfach hinzufügen .rtf-Dateien in das gewünschte Verzeichnis (oder vorhandene Dateien Bearbeiten) und den build-Prozess-Kennzahlen heraus, dass Sie mit den neuen/aktualisierten, läuft das Kommandozeilen-tool und kopiert die Dateien in das app-bundle. Es funktioniert wunderbar.
Schrieb ich einen blog-post, dass links auf eine Probe (Swift) Projekt demonstriert die Technik. Sie können es hier sehen:
Erstellen anklickbare URLs in ein UITextField, das in Ihrer app
Swift 3 Beispiel zu erkennen, die Aktionen auf dem zugeteilten text tippt
https://stackoverflow.com/a/44226491/5516830
Wie klug Sie können jede Aktion, die Sie wollen mit
shouldInteractWith URL
UITextFieldDelegate Methode.Prost!!
Ich habe geschrieben eine Methode, die fügt einen link(linkString) in einen string (fullString) mit einer bestimmten url(urlString):
Sollten Sie es so nennen:
Finden Sie einfach einen code-freie Lösung für UITextView:
Erkennung aktivieren->Links Optionen, die URL und auch E-Mail-werden erkannt und sind anklickbar!
Update:
Gab es 2 wichtige Teile zu meiner Frage:
Es stellt sich heraus, dass iOS 7 Hinzugefügt wurde die Fähigkeit zu laden zugeschriebenen text aus
NSData
.Erstellte ich eine benutzerdefinierte Unterklasse der
UITextView
nutzt die@IBInspectable
Attribut und ermöglicht das laden von Inhalten aus einer RTF-Datei direkt in IB. Geben Sie einfach den Dateinamen in IB und die individuelle Klasse macht den rest.Hier sind die details:
In iOS 7,
NSAttributedString
gewonnen die MethodeinitWithData:options:documentAttributes:error:
. Diese Methode ermöglicht das laden von einem NSAttributedString von einem NSData-Objekt. Sie können erste laden einer RTF-Datei in NSData, dann verwenden SieinitWithData:options:documentAttributes:error:
zu laden, dass NSData in text-Ansicht. (Beachten Sie, dass es auch eine MethodeinitWithFileURL:options:documentAttributes:error:
wird, laden zugeschrieben string direkt aus einer Datei, aber diese Methode war veraltet in iOS 9. Ist es sicherer, verwenden Sie die MethodeinitWithData:options:documentAttributes:error:
, das nicht veraltet.Wollte ich eine Methode, lassen Sie mich zu installieren klickbare links in meinen text Ansichten, ohne dass Sie irgendwelche spezifischen code für die links, ich war mit.
Die Lösung kam ich mit war zum erstellen einer benutzerdefinierten Unterklasse der UITextView ich nenne
RTF_UITextView
und geben ihm einen@IBInspectable
Eigenschaft namensRTF_Filename
. Hinzufügen der@IBInspectable
Attribut zu einer Eigenschaft bewirkt, Interface Builder setzen, dass Eigentum im "Attribute Inspector." Sie können dann festlegen, dass der Wert von IB ohne benutzerdefinierten code.Ich habe auch einen
@IBDesignable
- Attribut, um meine eigene Klasse. Die@IBDesignable
- Attribut sagt, dass Xcode installieren, sollte es eine laufende Kopie Ihres benutzerdefinierte view-Klasse in Interface builder, damit Sie es sehen können in der grafischen Anzeige der view-Hierarchie. ()Leider, für diese Klasse, die@IBDesignable
Eigenschaft zu sein scheint, flockig. Es funktionierte, als ich zuerst Hinzugefügt, dann habe ich aber gelöscht, die nur-text-Inhalt meiner text-Ansicht, und die Verknüpfungen in meiner Sicht ging Weg und ich war nicht in der Lage, um Sie zurück zu bekommen.)Den code für meine
RTF_UITextView
ist sehr einfach. Zusätzlich zu den@IBDesignable
- Attribut und einRTF_Filename
Eigenschaft mit der@IBInspectable
Attribut Hinzugefügt habe ich einendidSet()
Methode, um dieRTF_Filename
Eigenschaft. DiedidSet()
Methode aufgerufen wird, wird jedes mal, wenn der Wert derRTF_Filename
- Eigenschaft ändert. Der code für diedidSet()
Methode ist ganz einfach:Beachten Sie, dass, wenn die @IBDesignable Eigenschaft ist nicht zu zuverlässig können Sie eine Vorschau von Ihnen gestalteten text im Interface builder dann könnte es besser sein, um die oben genannten code als eine Erweiterung der UITextView eher als eine benutzerdefinierte Unterklasse. So könnten Sie es in einem beliebigen text-Ansicht ohne änderung der text-Ansicht der benutzerdefinierten Klasse.
Siehe meine andere Antwort, wenn Sie brauchen, um Unterstützung für iOS-Versionen vor iOS 7.
Können Sie ein Beispiel-Projekt, das diese neue Klasse von gitHub:
DatesInSwift demo-Projekt auf Github
Swift Version :
Ich brauchte, um zu halten, die mit einem reinen UILabel, so rief dieser aus meiner recognizer Tippen Sie auf (dieser basiert auf malex Antwort hier: Zeichen-index am touch-point für UILabel )
Die schnelle Antwort, ist mit UITextView statt UILabel. Sie aktivieren müssen
Selectable
und deaktivierenEditable
.Dann deaktivieren scroll-Indikatoren und springt.
Meine Lösung mit
NSMutableAttributedString
von html-stringNSHTMLTextDocumentType
Einen schnellen neben Duncan C ' s original-Beschreibung vis-á-vie IB Verhalten. Er schreibt: "Es ist trivial, hyperlinks anklickbar in einer UITextView. Sie stellen nur die "erkennen-links" - Kästchen auf der Ansicht in IB, und Sie erkennt die http-links und verwandelt Sie in hyperlinks."
Meiner Erfahrung (zumindest in xcode 7) ist, dass man auch entfernen Sie das Häkchen bei "Editable" - Verhalten für urls werden erkannt & anklickbar.
Fall, dass Sie Probleme mit dem, was @Karl Nosworthy und @esilver zur Verfügung gestellt hatte, oben habe ich aktualisiert, die NSMutableAttributedString Erweiterung der Swift 4-version.
Wenn Sie möchten, verwenden Sie die NSLinkAttributeName in einem UITextView, dann können Sie erwägen, die AttributedTextView Bibliothek. Es ist ein UITextView-Unterklasse, die macht es sehr einfach zu handhaben. Für mehr info siehe: https://github.com/evermeer/AttributedTextView
Können Sie irgendein Teil des Textes zu interagieren, wie diese (wo textView1 ist ein UITextView IBoutlet):
Sowie für das handling von hashtags und Erwähnungen können Sie code wie diesen:
Verwenden UITextView und setzen dataDetectorTypes für den Link.
wie diese:
Wenn Sie wollen, um zu erkennen, link, Telefonnummer,Adresse etc..dann
http://somedomain/someurl?param=value
Die ausgezeichnete Bibliothek von @AliSoftware
OHAttributedStringAdditions
macht es einfach, hinzufügen von links inUILabel
hier ist die Dokumentation: https://github.com/AliSoftware/OHAttributedStringAdditions/wiki/link-in-UILabelwenn Sie möchten, aktiv substring in Ihrem UITextView dann können Sie meine erweiterten TextView... es ist kurz und einfach. Sie können es Bearbeiten, wie Sie möchten.
Ergebnis:
code:
https://github.com/marekmand/ActiveSubstringTextView
WICHTIGSTEN PUNKTE: