Aktualisieren:
Meine Frage bestand aus zwei Hauptteilen:
- So erstellen Sie einen Link, bei dem sich der für den anklickbaren Link angezeigte Text von dem tatsächlich aufgerufenen Link unterscheidet:
- So richten Sie die Links ein, ohne benutzerdefinierten Code zum Festlegen der Attribute für den Text verwenden zu müssen.
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 Methode initWithData: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 dann initWithData:options:documentAttributes:error:
diese NSData in Ihre Textansicht laden. (Beachten Sie, dass es auch eine Methode gibt initWithFileURL: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 verwenden initWithData: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 geben RTF_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 einer RTF_Filename
Eigenschaft mit dem @IBInspectable
Attribut habe ich didSet()
der RTF_Filename
Eigenschaft eine Methode hinzugefügt . Die didSet()
Methode wird jedes Mal aufgerufen, wenn sich der Wert der RTF_Filename
Eigenschaft ändert. Der Code für die didSet()
Methode ist recht einfach:
@IBDesignable
class RTF_UITextView: UITextView
{
@IBInspectable
var RTF_Filename: String?
{
didSet(newValue)
{
//If the RTF_Filename is nil or the empty string, don't do anything
if ((RTF_Filename ?? "").isEmpty)
{
return
}
//Use optional binding to try to get an URL to the
//specified filename in the app bundle. If that succeeds, try to load
//NSData from the file.
if let fileURL = NSBundle.mainBundle().URLForResource(RTF_Filename, withExtension: "rtf"),
//If the fileURL loads, also try to load NSData from the URL.
let theData = NSData(contentsOfURL: fileURL)
{
var aString:NSAttributedString
do
{
//Try to load an NSAttributedString from the data
try
aString = NSAttributedString(data: theData,
options: [:],
documentAttributes: nil
)
//If it succeeds, install the attributed string into the field.
self.attributedText = aString;
}
catch
{
print("Nerp.");
}
}
}
}
}
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