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 UITextView
yang 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, NSAttributedString
diperoleh 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_UITextView
dan memberinya @IBInspectable
properti yang disebut RTF_Filename
. Menambahkan @IBInspectable
atribut 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 @IBDesignable
atribut ke kelas khusus saya. The @IBDesignable
atribut 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, @IBDesignable
properti 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_UITextView
sangat sederhana. Selain menambahkan @IBDesignable
atribut dan RTF_Filename
properti dengan @IBInspectable
atribut, saya menambahkan didSet()
metode ke RTF_Filename
properti. The didSet()
Metode dipanggil setiap saat nilai RTF_Filename
perubahan 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