gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:00:59 25 4
gpt4 key购买 nike

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

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

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

我创建了 NSTextStorage 的子类,它又是 NSMutableAttributedString 的子类。在该子类中,我重写了上述两种方法。

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

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

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

最佳答案

功能

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

实际上从未被调用过。

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

/* Note for subclassing NSTextStorage: NSTextStorage is a semi-abstract subclass of NSMutableAttributedString. It implements change management (beginEditing/endEditing), verification of attributes, delegate handling, and layout management notification. The one aspect it does not implement is the actual attributed string storage --- this is left up to the subclassers, which need to override the two NSMutableAttributedString primitives in addition to two NSAttributedString primitives:

  • (NSString *)string;
  • (NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range;

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

  • (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range; These primitives should perform the change then call edited:range:changeInLength: to get everything else to happen. */

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

这也是 AppKit 实现 NSTextView 的方式:

enter image description here

关于ios - 编辑属性字符串时会调用哪种替换方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55208022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com