gpt4 book ai didi

macos - 修改 NSTextStorage 导致插入点移动到行尾

转载 作者:行者123 更新时间:2023-12-03 16:04:06 25 4
gpt4 key购买 nike

我有一个 NSTextView 子类作为其 NSTextStorage 委托(delegate)。我正在尝试做两件事:

  1. 以某种方式突出显示文本
  2. 评估文本,然后将答案附加到 TextView 。

我使用两种不同的方法执行此操作,均由 - (void)textStorageWillProcessEditing:(NSNotification *)notification 委托(delegate)回调调用。

我可以很好地进行语法突出显示,但是当涉及到附加我的答案时,插入点跳到行尾,我真的不知道为什么。我的评估方法如下所示:

NSString *result = ..;
NSRange lineRange = [[textStorage string] lineRangeForRange:[self selectedRange]];
NSString *line = [[textStorage string] substringWithRange:lineRange];
line = [self appendResult:result toLine:line]; // appends the answer

[textStorage replaceCharactersInRange:lineRange withString:line];

这样做可以很好地附加我的结果,但问题是,如上所述,插入点跳到末尾。

我已经尝试过:

  1. 将上述内容包装在 [textStorage beginEditing]-endEditing 中。
  2. 在更改文本存储之前保存选择范围(即插入点),以便之后可以重置它,但没有骰子。

我这样做对吗?我试图以最简单的方式做到这一点,而且我也不确定这是否是进行解析/突出显示的理想位置。文档让我相信了这一点,但也许这是错误的。

最佳答案

插入点移动的原因

令人惊讶的是,我从未找到任何实际解释来解释为什么这些建议有效(或无效)。

深入研究一下,插入点移动的原因是:.editedCharacters(ObjC中的NSTextStorageEditedCharacters)影响了插入点的位置来自 NSLayoutManager.processEditing(from:editedMask:...) 的插入点。

如果仅发送.editedAttributes/NSTextStorageEditedAttributes,则不会触及插入点。当您突出显示时,这就是您想要实现的目标:仅更改属性。

为什么突出显示会影响插入点

此处突出显示的问题是,NSTextStorage 在单个处理运行期间收集所有已编辑的 调用,并从用户开始组合范围- 编辑更改(例如,键入时插入),然后形成此范围与 addAttributes(_:range:) 报告的所有范围的并集。这会导致一次 NSLayoutManager.processEditing(from:editedMask:...) 调用 - 其 editedMask 均为 [.editedCharacters, .editedAttributes].

因此,您想要发送突出显示范围的.editedAttributes,但最终却与.editedCharacters形成联合。该联合将插入点 waaaaaaaay 移到了它应该去的位置之外。

更改 processEditing 中的顺序以首先调用 super 是有效的,因为布局管理器将收到编辑完成的通知。但这种方法仍然会在某些边缘情况下出现问题,导致在您输入非常大的段落时布局无效或 ScrollView 抖动。

This is true for hooking into NSTextStorageDelegate顺便说一下,也是如此。

在布局真正完成后 Hook 回调以触发突出显示,而不是processEditing

基于 Cocoa 框架固有的原因,唯一能够稳健工作的解决方案是专门从 textDidChange(_:) 执行突出显示,即在布局处理真正完成之后。订阅 NSTextDidChangeNotification 也同样有效。

缺点:您必须触发突出显示过程以对底层字符串进行编程更改,因为这些不会调用 textDidChange(_:) 回调。

<小时/>

如果您想更多地了解问题的根源,我将更多我的研究、不同的方法和解决方案的细节放在一篇更长的博客文章中以供引用。这篇文章本身仍然是一个独立的解决方案: http://christiantietze.de/posts/2017/11/syntax-highlight-nstextstorage-insertion-point-change/

关于macos - 修改 NSTextStorage 导致插入点移动到行尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12151360/

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