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

Kri*_*oot 7 cocoa-touch uitextview nsattributedstring ios

使用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
Run Code Online (Sandbox Code Playgroud)

这应该有用吗?

jul*_*n_c 16

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

访问属性:

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

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


rma*_*ddy 5

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

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

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

  • 对我而言,这听起来像声音推理:UITextView支持属性字符串和属性字符串支持自定义键,因此UITextView将使用具有自定义键的属性字符串.文件中的一些警告会受到欢迎.但我明白你的观点:) (2认同)
  • 它确实强烈地暗示它"一个属性字符串按名称标识属性,使用NSDictionary对象存储给定名称下的值.您可以将任何属性名称/值对分配给一系列字符 - 这取决于您的用于解释自定义属性的应用程序(请参阅属性字符串编程指南)." Apple的UIKit控件似乎并没有保留自定义属性.这会很好. (2认同)
  • 这个接受的答案已经过时,因为下面的答案说iOS 7接受自定义属性. (2认同)
  • @fatuhoku事情随着时间而变化.留下你对未来读者的评论很好.指出答案现在已经过时没有错.但是,当它被回答时,不要投票给一个正确的答案.否则,由于API和功能的变化,您可能会花费余生来投票过时的答案.每次有API更新时,您都不能指望人们返回并更新所有答案. (2认同)