NSMutableAttributedString
定义了两种字符串替换方法:
scripts
和
package.json
我创建了func replaceCharacters(in range: NSRange,
with str: String)
的子类,而该子类又是func replaceCharacters(in range: NSRange,
with attrString: NSAttributedString)
的子类。在该子类中,我覆盖了以上两种方法。
令我惊讶的是,当我在文本视图中键入或粘贴某些内容时,从未调用后一种方法(传递属性替换字符串)。每次都只调用纯字符串替换方法。
这使我想到了一个问题:
当用户在文本视图中编辑文本时,这两种方法实际上是基于哪些规则的?
(我需要在文本存储中执行不同的操作,具体取决于属性替换字符串是否包含特定类型的文本附件。但是,如果从未调用属性字符串的替换方法,我看不出如何进行这种区别。)
答案 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
的方式: