2011-03-16 46 views
6

我已经通过正确设置NSTextViewNSTextStorage委托和更改-textStorageDidProcessEditing中的文本属性来实现基本语法高亮。修改NSTextStorage属性会导致滚动视图跳转

基本过程如下:

- (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]; 
} 

每当输入SPACE字符时调用-removeAttribute:range:-addAttribute:value:range,围绕NSScrollView位置的NSTextView开始跳转(滚动旋钮到达附近的某个随机位置) )

造成这种情况的原因是什么?

回答

9

我终于从我的观察发现,按空格键时,但对于其他按键,比如退格键和跳跃不仅发生和出现这种情况什么时候这两种情况发生。
- 非连续布局开启
- 任何修改,甚至属性,可见区域先前文本中的内部-textStorageDidProcessEditing:
看起来它是不连续的布局功能中的错误做!如果一位专家能够证实,会很好。
这似乎什么都没有做与调用-beginEditing-endEditing

+0

我刚刚有这个问题,我非常感谢这个答案。拯救了我无尽的悲伤。 – 2012-06-21 22:20:53

+0

我在'processEditing'中处理自定义文本存储。移动到委托方法解决了我的问题。谢谢! – 2013-12-31 04:10:35

+0

这似乎是正确的答案,应该是被接受的答案。关闭IB中的非连续布局可以解决问题。其他建议的修正,例如在'textStorageDidProcessEditing:'内部使用'didChangeText',或不使用'beginEditing' /'endEditing',不是一个好主意,不管它们是否避免了这个特定的错误。我刚刚在苹果的bug记者提交了这个bug,#24539235。请提交bug! – bhaller 2016-02-06 13:41:27

2

原来拨打电话-beginEditing-endEditing-textStorageDidProcessEditing:功能不是很健康!我转而使用NSTextView s -didChangeText

+0

这是不正确的,不应该是公认的答案。 trss正确的答案正确地将问题诊断为与不连续布局有关。 – bhaller 2016-02-06 13:43:05

4

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

Here's the post

在我的情况,我经历这种行为不论使用经由通知称为委托方法或中间方法,并且当文本存储的内容变得比包围文本查看大只是发生,从而导致滚动要主动将文本视图推到顶部。关闭该选项后,不再观察到“跳跃”。 希望它有帮助。 Tom

2

为什么不直接删除-beginEditing-endEditing来电?我只是有同样的问题,这为我解决了这个问题。

+0

但奇怪的是,问题似乎随机重现!我无法隔离确切的原因。但是我相信我一旦删除'-beginEditing'和'-endEditing'调用就会发现问题立即消失。 '-didChangeText'确实出现了一个很好的选择,虽然我还没有尝试出来呢,因为大多数人建议使用'-textStorageDidProcessEditing'语法高亮,即使程序通过修改代码发生。 – trss 2011-12-28 09:31:08