Memperbarui:
Ada 2 bagian penting dari pertanyaan saya:
- Cara membuat tautan di mana teks yang ditampilkan untuk tautan yang dapat diklik berbeda dari tautan aktual yang dipanggil:
- Cara mengatur tautan tanpa harus menggunakan kode khusus untuk mengatur atribut pada teks.
Ternyata iOS 7 menambahkan kemampuan untuk memuat teks yang dikaitkan dari NSData.
Saya membuat subkelas kustom UITextViewyang memanfaatkan@IBInspectable atribut dan memungkinkan Anda memuat konten dari file RTF langsung di IB. Anda cukup mengetikkan nama file ke IB dan kelas kustom melakukan sisanya.
Berikut detailnya:
Di iOS 7, NSAttributedStringdiperoleh metode initWithData:options:documentAttributes:error:. Metode itu memungkinkan Anda memuat NSAttributedString dari objek NSData. Pertama-tama Anda dapat memuat file RTF ke NSData, lalu gunakan initWithData:options:documentAttributes:error:untuk memuat NSData itu ke dalam tampilan teks Anda. (Perhatikan bahwa ada juga metode initWithFileURL:options:documentAttributes:error:yang akan memuat string yang dikaitkan langsung dari file, tetapi metode itu sudah usang di iOS 9. Lebih aman untuk menggunakan metode ini initWithData:options:documentAttributes:error:, yang tidak usang.
Saya ingin metode yang memungkinkan saya memasang tautan yang dapat diklik ke dalam tampilan teks saya tanpa harus membuat kode khusus untuk tautan yang saya gunakan.
Solusi yang saya buat adalah membuat subkelas kustom dari UITextView yang saya panggil RTF_UITextViewdan memberinya @IBInspectableproperti yang disebut RTF_Filename. Menambahkan @IBInspectableatribut ke properti menyebabkan Interface Builder memaparkan properti itu di "Atribut Inspektur." Anda kemudian dapat menetapkan nilai itu dari IB tanpa kode khusus.
Saya juga menambahkan @IBDesignableatribut ke kelas khusus saya. The @IBDesignableatribut memberitahu Xcode bahwa itu harus menginstal salinan menjalankan adat pandang kelas Anda menjadi Antarmuka pembangun sehingga Anda dapat melihatnya dalam tampilan grafis dari hierarki tampilan Anda. () Sayangnya, untuk kelas ini, @IBDesignableproperti tampaknya serpihan. Ini berfungsi ketika saya pertama kali menambahkannya, tetapi kemudian saya menghapus isi teks biasa dari tampilan teks saya dan tautan yang dapat diklik dalam tampilan saya hilang dan saya belum bisa mendapatkannya kembali.)
Kode untuk saya RTF_UITextViewsangat sederhana. Selain menambahkan @IBDesignableatribut dan RTF_Filenameproperti dengan @IBInspectableatribut, saya menambahkan didSet()metode ke RTF_Filenameproperti. The didSet()Metode dipanggil setiap saat nilai RTF_Filenameperubahan properti. Kode untuk didSet()metode ini cukup sederhana:
@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.");
}
}
}
}
}
Perhatikan bahwa jika properti @IBDesignable tidak akan memungkinkan Anda untuk melihat pratinjau teks gaya Anda di pembuat antarmuka, maka mungkin lebih baik untuk mengatur kode di atas sebagai ekstensi UITextView daripada subkelas kustom. Dengan begitu Anda bisa menggunakannya dalam tampilan teks apa pun tanpa harus mengubah tampilan teks ke kelas kustom.
Lihat jawaban saya yang lain jika Anda perlu mendukung versi iOS sebelum iOS 7.
Anda dapat mengunduh proyek sampel yang menyertakan kelas baru ini dari gitHub:
Proyek demo DatesInSwift di Github