2011-03-16 3 views
6

NSTextViewNSTextStorage 대리자를 올바르게 설정하고 -textStorageDidProcessEditing의 텍스트 특성을 변경하여 기본 구문 강조를 구현했습니다. SPACE 문자를 입력 할 때 -removeAttribute:range: 또는 -addAttribute:value:range가 호출 될 때마다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]; 
} 

을 다음과 같이

기본 프로세스는, NSScrollView 위치를 둘러싼 NSTextView들 (스크롤 놉 가까운 어떤 임의의 위치로 이동 움직이지 시작)

이 문제의 원인은 무엇입니까?

답변

9

필자는 마침내 스페이스 바를 누를 때뿐만 아니라 백 스페이스와 같은 다른 키에도 점프가 발생한다는 것을 알게되었습니다. 이러한 현상이 발생하면 정확하게 발생합니다.
- 비 연속 레이아웃이
켜져 - 가시 영역에 선행 텍스트, 심지어 속성으로 모든 수정은 비 연속 레이아웃 기능에서 버그가이 같은 -textStorageDidProcessEditing:
이 보이는 내부한다! 전문가가 확인할 수 있다면 좋을 것입니다.
-beginEditing-endEditing을 호출하는 것과 아무런 관련이없는 것으로 보입니다.

+0

방금이 문제가 발생했으며이 답변에 대해 매우 감사드립니다. 슬픔의 끝없는 나를 구 했어요. –

+0

커스텀 텍스트 저장에서'processEditing'으로 처리하고있었습니다. 그 대리자 메서드로 이동 내 문제가 해결되었습니다. 감사! –

+0

이것은 정답 인 것으로 보이며 허용되는 대답이어야합니다. IB에서 비 인접 레이아웃을 끄면 문제가 해결됩니다. 'didChangeText'를 대신 사용하거나,'textStorageDidProcessEditing :'내부에서'beginEditing' /'endEditing'을 사용하지 않는 것과 같은 다른 수정안은이 특정 버그를 피하든 안하든 좋은 생각이 아닙니다. 방금 Apple 버그 게시자에게이 버그를 제출했습니다. # 24539235 버그를 신고하십시오! – bhaller

2

-textStorageDidProcessEditing: 함수 내에서 -beginEditing-endEditing 함수가 매우 건강하지 않은 것으로 나타났습니다! 대신 NSTextView s -didChangeText으로 전환했습니다.

+0

이것은 올바르지 않으며 허용되는 대답이 아니어야합니다. trss가 정답을 사용하면 문제가 인접하지 않은 레이아웃과 관련되어있는 것으로 올바르게 진단됩니다. – bhaller

4

에릭. 해결했는지 모르겠습니다. 그러나 비슷한 문제가 발생하여 NSTextView의 XCode 4.x 특성 관리자에서 "비 연속 레이아웃"옵션을 해제하면 문제가 해결 될 것입니다. NSLayoutManager에 대한 문서는 "개요"섹션에서 더 많은 단서를 제공합니다 : "인접하지 않은 레이아웃은 Mac OS X v10.5의 새로운 레이아웃 관리자 비헤이비어입니다.". 내 경우

Here's the post

, 나는 통지를 통해 호출 대리자 메서드 또는 중간 방법을 사용하여 관계없이이 문제를 경험하고 텍스트 저장 내용은 포함하는 텍스트보기보다 큰되었을 때 스크롤이 활성화 원인 만 일어난 텍스트 뷰를 맨 위로 밀어 넣습니다. 옵션을 끄면 "점프"가 더 이상 표시되지 않습니다. 도움이 되길 바랍니다. Tom

2

-beginEditing-endEditing 전화를 삭제하지 않는 이유는 무엇입니까? 나는 지금 막 동일한 문제가 있고 이것은 나를 위해 문제를 해결한다.

+0

하지만 이상하게도 문제는 무작위로 다시 나타납니다! 정확한 원인을 찾아 낼 수 없습니다. 하지만 일단'-beginEditing'과'-endEditing' 호출을 제거하면 즉시 문제가 사라진다는 것을 알았습니다. '-didChangeText'는 좋은 대안으로 보입니다. 아직 시도하지는 않았지만, 대부분의 사람들은 코드를 통해 프로그램이 수정 될 때에도 구문 강조를 위해 -textStorageDidProcessEditing을 사용하는 것이 좋습니다. – trss

관련 문제