2011-03-16 82 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

相關問題