修改NSTextStorage属性会导致滚动视图跳转

Eri*_*ner 6 macos cocoa objective-c

我已经通过正确设置NSTextStoragemy 的委托NSTextView和更改文本属性来实现基本的语法突出显示-textStorageDidProcessEditing.

基本过程如下

- (void)textStorageDidProcessEditing:(NSNotification *)notification {
  NSTextStorage *storage = [notification object];
  [storage beginEditing];

  NSString *text = [storage string];
  NSRange textRange = NSMakeRange(0, [text length]);

  [storage removeAttribute:NSForegroundColorAttributeName range:textRange];

  // Some regex matching here ...

  [storage addAttribute:NSForegroundColorAttributeName
                  value:[COSyntax colorForPatternGroup:pattern.groupName]
                  range:capturedRanges[group]];

  [storage endEditing];
}
Run Code Online (Sandbox Code Playgroud)

无论何时-removeAttribute:range:-addAttribute:value:rangeSPACE输入字符时调用,NSTextView周围的NSScrollView位置都会开始跳转(滚动旋钮到达附近的某个随机位置)

是什么导致了这个?

trs*_*rss 11

我终于从我的观察中发现跳跃不仅在按空格键时发生,而且在其他键如退格键时发生,这恰好发生在两者都发生时.
- 打开非连续布局
- 对可见区域之前的文本进行任何修改,甚至是属性,-textStorageDidProcessEditing:
看起来像是非连续布局功能中的错误!如果专家能够确认,那将会很好.
它似乎与呼叫-beginEditing和无关-endEditing.

  • 这似乎是正确的答案,并且应该是被接受的答案。关闭 IB 中的非连续布局可以解决该问题。其他建议的修复方案,例如使用“didChangeText”,或者不在“textStorageDidProcessEditing:”中使用“beginEditing”/“endEditing”,都不是一个好主意,无论它们是否避免了这个特定的错误。我刚刚向 Apple 的错误报告者提交了此错误,#24539235。请提交错误! (2认同)

小智 6

埃里克.我不知道你是否解决了这个问题.但是,我遇到了类似的问题,我发现关闭NSTextView的XCode 4.x属性检查器中关闭"非连续布局"选项将解决问题.NSLayoutManager的文档提供了更多线索(在"概述"部分下):"非连续布局是Mac OS X v10.5中新增的可选布局管理器行为......".

这是帖子

在我的例子中,我遇到了这种行为,无论是使用委托方法还是通过通知调用的中间方法,只有当文本存储内容变得大于封闭的文本视图时才会发生,导致滚动处于活动状态并将文本视图"推送"到顶部.关闭选项后,不再观察到"跳跃".希望能帮助到你.汤姆