अपडेट करें:
मेरे प्रश्न के 2 मुख्य भाग थे:
- लिंक करने के लिए कैसे जहां क्लिक करने योग्य लिंक के लिए दिखाया गया पाठ लागू किए गए वास्तविक लिंक से अलग है:
- पाठ पर विशेषताएँ सेट करने के लिए कस्टम कोड का उपयोग किए बिना लिंक कैसे सेट करें।
यह पता चला है कि iOS 7 ने जिम्मेदार टेक्स्ट को लोड करने की क्षमता को जोड़ा है NSData
।
मैंने एक कस्टम उपवर्ग बनाया जिसका UITextView
फायदा उठाता है@IBInspectable
विशेषता और आपको IB में सीधे RTF फ़ाइल से सामग्री लोड करने देता है। आप बस आईबी में फ़ाइल नाम टाइप करते हैं और कस्टम वर्ग बाकी काम करता है।
यहाँ विवरण हैं:
IOS 7 में, NSAttributedString
विधि प्राप्त की initWithData:options:documentAttributes:error:
। वह विधि आपको NSData ऑब्जेक्ट से एक NSAttributedString लोड करने देता है। आप पहले NSData में RTF फ़ाइल लोड कर सकते हैं, फिर initWithData:options:documentAttributes:error:
उस NSData को अपने टेक्स्ट दृश्य में लोड करने के लिए उपयोग कर सकते हैं। (ध्यान दें कि एक विधि भी है initWithFileURL:options:documentAttributes:error:
जो एक फ़ाइल से सीधे एक स्ट्रिंग को लोड करेगी, लेकिन उस विधि को iOS 9 में पदावनत किया गया था। यह विधि का उपयोग करने के लिए सुरक्षित है initWithData:options:documentAttributes:error:
, जिसे पदावनत नहीं किया गया था।
मैं एक ऐसी विधि चाहता था जिससे मैं अपने पाठ विचारों में क्लिक करने योग्य लिंक स्थापित कर सकूं, जो मेरे द्वारा उपयोग किए जा रहे लिंक के लिए कोई कोड विशिष्ट नहीं है।
मैं जिस समाधान के साथ आया था वह UITextView I का एक कस्टम उपवर्ग बनाने के लिए था जिसे मैं कॉल करता हूं RTF_UITextView
और इसे एक @IBInspectable
संपत्ति देता हूं RTF_Filename
। जोड़ रहा है@IBInspectable
गुण विशेषता इंटरफ़ेस बिल्डर को उस संपत्ति को "इंस्पेक्टर इंस्पेक्टर।" फिर आप उस मान को IB wihtout कस्टम कोड से सेट कर सकते हैं।
मैंने @IBDesignable
अपने कस्टम वर्ग में एक विशेषता भी जोड़ी है । @IBDesignable
विशेषता Xcode बताता है कि यह इंटरफ़ेस बिल्डर में अपने कस्टम दृश्य वर्ग के एक चल प्रतिलिपि स्थापित करना चाहिए ताकि आप उसे अपने दृश्य पदानुक्रम के चित्रमय प्रदर्शन में देख सकते हैं। () दुर्भाग्य से, इस वर्ग के लिए, @IBDesignable
संपत्ति परतदार लगती है। जब मैंने पहली बार इसे जोड़ा तो यह काम कर रहा था, लेकिन फिर मैंने अपने पाठ दृश्य की सादे पाठ सामग्री को हटा दिया और मेरे विचार में क्लिक करने योग्य लिंक हट गए और मैं उन्हें वापस नहीं ले पाया।)
मेरे लिए कोड RTF_UITextView
बहुत सरल है। @IBDesignable
विशेषता के RTF_Filename
साथ विशेषता और एक संपत्ति को जोड़ने के अलावा @IBInspectable
, मैंने संपत्ति में एक didSet()
विधि जोड़ी RTF_Filename
। didSet()
विधि का मूल्य किसी भी समय कहा जाता हो जाता है RTF_Filename
गुण परिवर्तन। didSet()
विधि के लिए कोड काफी सरल है:
@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 संपत्ति आपको इंटरफ़ेस बिल्डर में अपने स्टाइल किए गए पाठ का पूर्वावलोकन करने की अनुमति देने के लिए मज़बूती से नहीं जा रही है, तो हो सकता है कि कस्टम उपवर्ग के बजाय UITextView के विस्तार के रूप में उपरोक्त कोड को सेट करना बेहतर हो। इस तरह आप इसे कस्टम क्लास में टेक्स्ट व्यू को बदलने के बिना किसी भी टेक्स्ट व्यू में इस्तेमाल कर सकते हैं।
अगर आपको iOS 7 से पहले iOS वर्जन को सपोर्ट करने की जरूरत है तो मेरा दूसरा जवाब देखें।
आप एक नमूना परियोजना डाउनलोड कर सकते हैं जिसमें gitHub का यह नया वर्ग शामिल है:
Github पर DatesInSwift डेमो प्रोजेक्ट