1

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

func replaceCharacters(in range: NSRange, 
                       with str: String)

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

我创建了一个子类,NSTextStorage它又是NSMutableAttributedString. 在那个子类中,我覆盖了上述两种方法。

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

这引出了一个问题:
这两种方法实际上是根据哪些规则调用的当用户在文本视图中编辑文本时,

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

4

1 回答 1

2

功能

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

实际上从未调用过。

从文档(下面)中可以清楚地看出,应该使用组合, replaceCharactersInRange:withString:然后是调用setAttributes:range:

/* 子类化 NSTextStorage 的注意事项:NSTextStorage 是 NSMutableAttributedString 的半抽象子类。它实现了变更管理(beginEditing/endEditing)、属性验证、委托处理和布局管理通知。它没有实现的一个方面是实际的属性字符串存储——这留给子类,除了两个 NSAttributedString 原语之外,它们还需要覆盖两个 NSMutableAttributedString 原语:

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

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

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

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

这也是 AppKit 的实现方式NSTextView

在此处输入图像描述

于 2019-03-17T16:36:46.913 回答