更新:
我的问题有两个关键部分:
- 如何制作一个链接,其中可点击链接显示的文本与所调用的实际链接不同:
- 如何设置链接而不必使用自定义代码来设置文本的属性。
事实证明,iOS 7添加了从中加载属性文本的功能NSData
。
我创建了一个UITextView
利用该@IBInspectable
属性的自定义子类,并允许您直接在IB中从RTF文件加载内容。您只需在IB中键入文件名,其余的由定制类完成。
详细信息如下:
在iOS 7中,NSAttributedString
获得了方法initWithData:options:documentAttributes:error:
。该方法使您可以从NSData对象加载NSAttributedString。您可以先将RTF文件加载到NSData中,然后使用initWithData:options:documentAttributes:error:
将该NSData加载到文本视图中。(请注意,还有一种方法initWithFileURL:options:documentAttributes:error:
可以直接从文件中加载属性字符串,但是该方法在iOS 9中已被弃用。使用不被弃用的method更为安全initWithData:options:documentAttributes:error:
。
我想要一种方法,使我可以将可点击的链接安装到我的文本视图中,而不必创建特定于我正在使用的链接的代码。
我想到的解决方案是创建一个我调用的UITextView的自定义子类,RTF_UITextView
并为其提供一个@IBInspectable
名为的属性RTF_Filename
。将@IBInspectable
属性添加到属性会使Interface Builder在“ Attributes Inspector”中公开该属性。然后,您可以从IB定制代码中设置该值。
我还向@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演示项目