编辑属性字符串时调用哪种替换方法?

时间:2019-03-17 14:16:31

标签: ios cocoa nsmutableattributedstring textkit nstextstorage

NSMutableAttributedString定义了两种字符串替换方法:

scripts

package.json

我创建了func replaceCharacters(in range: NSRange, with str: String) 的子类,而该子类又是func replaceCharacters(in range: NSRange, with attrString: NSAttributedString) 的子类。在该子类中,我覆盖了以上两种方法。

令我惊讶的是,当我在文本视图中键入或粘贴某些内容时,从未调用后一种方法(传递属性替换字符串)。每次都只调用纯字符串替换方法。

这使我想到了一个问题:
当用户在文本视图中编辑文本时,这两种方法实际上是基于哪些规则的?

(我需要在文本存储中执行不同的操作,具体取决于属性替换字符串是否包含特定类型的文本附件。但是,如果从未调用属性字符串的替换方法,我看不出如何进行这种区别。)

1 个答案:

答案 0 :(得分:2)

功能

func replaceCharacters(in range: NSRange, 
                with attrString: NSAttributedString)

实际上从未被调用。

从下面的文档中可以明显看出,应该结合使用replaceCharactersInRange:withString:和呼叫setAttributes:range:

  

/ *关于子类化NSTextStorage的注意事项:NSTextStorage是一个   NSMutableAttributedString的半抽象子类。它实现   变更管理(beginEditing / endEditing),验证   属性,委托处理和布局管理通知。的   它未实现的一方面是实际的属性字符串   存储---这留给子类,需要重写   除了两个NSMutableAttributedString原语   NSAttributedString原语:

     
      
  • (NSString *)string;
  •   
  • (NSDictionary *)attributesAtIndex:(NSUInteger)位置有效范围:(NSRangePointer)范围;

  •   
  • (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)str;

  •   
  • (void)setAttributes:(NSDictionary *)attr range:(NSRange)range;这些原语应执行更改,然后调用   编辑:范围:changeInLength:使其他所有事情发生。   * /
  •   

确保您已自定义实现这些方法。

这也是AppKit实现NSTextView的方式:

enter image description here