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

时间:2012-11-30 15:19:06

标签: ios cocoa-touch uitextview nsattributedstring

使用UITextView时,我尝试将自定义属性添加到属性字符串中。但是,在分配到UITextView的attributedText后,所有自定义键都将丢失。像这样:

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

这应该有用吗?

3 个答案:

答案 0 :(得分:16)

从iOS 7开始,它现在可以按照您的喜好运行:

来自Accessing Attributes

  

属性字符串按名称标识属性,在NSDictionary对象中的属性名称下存储值,NSDictionary对象又与NSRange关联,NSRange指示字典属性应用的字符。 除标准属性外,您还可以将任何属性名称 - 值对分配给一系列字符。

它适用于标准和NSTextStorage(文本工具包)支持的UITextViews。

答案 1 :(得分:5)

根据评论,您试图滥用NSAttributedStringNSAttributedStringUITextView仅用于处理记录的属性。您可能最初可以在字符串中存储自定义属性,但是一旦文本视图开始处理属性文本并且您向文本视图询问最新的属性文本,文本视图将很快消除任何自定义属性。

更好的解决方案是创建一个扩展UITextView的类。您的子类应添加一个属性,该属性可以包含您想要的任何自定义属性。或者您的自定义类可能会覆盖attributedText和'setAttributedText:`方法。这些将负责保存和恢复在属性字符串中找到的任何自定义属性。

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

答案 2 :(得分:3)

UITextView并不真正显示属性字符串。 Apple有一个内部类NSHTMLWriter,它将设置的NSAttributedString转换为HTML数据,然后由内容UIWebDocumentView(实际上是Webkit)显示

请在此处查看我的分析:http://www.cocoanetics.com/2012/12/uitextview-caught-with-trousers-down/