UITextView与NSAttributedString和自定义属性不起作用

当使用UITextView时,我尝试将自定义属性添加到属性string。 但是,分配给UITextView的属性文本后,所有自定义键都将丢失。 喜欢这个:

NSMutableAttributedString *lString = [[ NSMutableAttributedString alloc ] initWithString: @"astring" attributes: @{ @"customkey": @"customvalue" }]; NSLog(@"string: %@", lString); // shows customkey present textView.attributedText = lString; NSLog(@"result: %@", self.textView.attributedText); // shows customkey missing 

这是应该工作?

根据评论,你正试图误用NSAttributedStringNSAttributedStringUITextView仅用于处理logging的属性。 您最初可以将自定义属性存储在string中,但是一旦文本视图开始处理属性文本,并且要求文本视图查看最新的属性文本,则文本视图将很长时间没有任何自定义属性。

更好的解决scheme是创build一个扩展UITextView的类。 你的子类应该添加一个可以容纳你想要的自定义属性的属性。 或者,也许你的自定义类会覆盖JavasText和'setAttributedText:`方法。 这些将会保存并恢复在属性string中find的任何自定义属性。

注意: 这个答案适用于iOS 6及更早版本 。 对于iOS 7,请参阅下面的@ julien_c的答案。

从iOS 7开始,它现在可以正常工作:

来自访问属性 :

属性string按名称标识属性,将属性名称下的值存储在NSDictionary对象中,NSDictionary对象又与NSRange相关联,该NSRange指示字典属性所应用的字符。 除了标准属性之外,您还可以为您希望的一系列字符分配任何属性名称 – 值对。

它与标准和NSTextStorage (文本工具包)支持UITextViews。

UITextView并不真正显示属性string。 苹果有一个内部类NSHTMLWriter,它将设置的NSAttributedString转换成HTML数据,然后由内容UIWebDocumentView显示(这本质上是Webkit)

在这里看到我的分析: http : //www.cocoanetics.com/2012/12/uitextview-caught-with-trousers-down/