Güncelleme:
Sorumun 2 anahtar kısmı vardı:
- Tıklanabilir bağlantı için gösterilen metnin, çağrılan gerçek bağlantıdan farklı olduğu bir bağlantı nasıl yapılır:
- Metin üzerindeki öznitelikleri ayarlamak için özel kod kullanmak zorunda kalmadan bağlantılar nasıl ayarlanır.
Görünüşe göre iOS 7, ilişkilendirilen metni yükleme yeteneğini ekledi NSData
.
Özel bir alt sınıf oluşturdum UITextView
.@IBInspectable
Öznitelikten ve içeriği doğrudan IB'de bir RTF dosyasından yüklemenizi sağlayan . Dosya adını IB'ye yazmanız yeterlidir ve özel sınıf gerisini halleder.
İşte detaylar:
İOS 7'de NSAttributedString
yöntemi kazandı initWithData:options:documentAttributes:error:
. Bu yöntem, bir NSData nesnesinden bir NSAttributedString yüklemenize izin verir. Önce bir RTF dosyasını NSData'ya initWithData:options:documentAttributes:error:
yükleyebilir , ardından bu NSData'yı metin görünümünüze yüklemek için kullanabilirsiniz . ( initWithFileURL:options:documentAttributes:error:
İlişkilendirilmiş bir dizeyi doğrudan bir dosyadan yükleyecek bir yöntem olduğunu, ancak bu yöntemin iOS 9'da kullanımdan initWithData:options:documentAttributes:error:
kaldırıldığını unutmayın. Kullanımdan kaldırılmayan yöntemi kullanmak daha güvenlidir .
Kullandığım bağlantılara özgü herhangi bir kod oluşturmak zorunda kalmadan metin görünümlerime tıklanabilir bağlantılar yüklememe izin veren bir yöntem istedim.
Ben geldi çözüm UITextView I çağrı özel bir alt sınıf oluşturmak RTF_UITextView
ve @IBInspectable
denilen bir özellik vermek oldu RTF_Filename
. Ekleme@IBInspectable
Bir özelliğe özellik Interface Builder'ın bu özelliği "Özellik Denetçisi" nde göstermesine neden olur. Daha sonra bu değeri IB özel koduyla ayarlayabilirsiniz.
Özel sınıfıma da bir @IBDesignable
özellik ekledim . @IBDesignable
Nitelik, görünüm hiyerarşi grafiksel ekranda görebilirsiniz nedenle Arayüz Oluşturucu içine özel görünüm sınıfının çalışan kopyasını yüklemek gerektiğini Xcode söyler. () Ne yazık ki, bu sınıf için, @IBDesignable
mülkiyet lapa lapa gibi görünüyor. İlk eklediğimde işe yaradı, ancak daha sonra metin görünümümün düz metin içeriğini sildim ve görünümümdeki tıklanabilir bağlantılar kayboldu ve bunları geri alamadım.)
Benim için kod RTF_UITextView
çok basit. @IBDesignable
Özniteliği ve özniteliği olan bir RTF_Filename
özelliği eklemeye ek olarak, özelliğe @IBInspectable
bir didSet()
yöntem ekledim RTF_Filename
. didSet()
Yöntem herhangi bir zaman değerini çağrılanRTF_Filename
değiştiğinde . didSet()
Yöntemin kodu oldukça basittir:
@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.");
}
}
}
}
}
@IBDesignable özelliği, stilli metninizi Interface builder'da önizlemenize güvenilir bir şekilde izin vermiyorsa, yukarıdaki kodu özel bir alt sınıf yerine UITextView uzantısı olarak ayarlamak daha iyi olabilir. Bu şekilde, metin görünümünü özel sınıfa değiştirmek zorunda kalmadan herhangi bir metin görünümünde kullanabilirsiniz.
İOS 7'den önceki iOS sürümlerini desteklemeniz gerekiyorsa diğer cevabımı görün.
Bu yeni sınıfı içeren örnek bir projeyi gitHub'dan indirebilirsiniz:
DatesInSwift demo projesi Github