2009-03-24 4 views
4

UKSyntaxColoredTextDocument 0.4 http://www.zathras.de/angelweb/blog-uksctd-oh-four.htm의 문제를 진단하려고하는데 입력하는 동안 지정한 글꼴과 다른 글꼴로 실제로 들어있는 텍스트가 사라집니다. (이 멋진 유틸리티를 다운로드하여 사용해 보면이 문제를 직접 경험할 수 있습니다 ...)- [NSTextStorage replaceCharactersInRange : withAttributedString :]가 때때로 다른 문자 세트의 글꼴을 사용하지 않는 경우가 있습니까?

여기에 배경이 있습니다. 이것은 입력 할 때 회상색을 나타내는 구문 색상 코드입니다. 그것은 훌륭하지만 실제로 해당 텍스트보기 (예 : Monaco, Helvetica)에 설정된 글꼴의 일부가 아닌 일부 문자를 입력하면 ... ZapfDingbatsITC 또는 ZapfDingbatsITC와 같은 글꼴을 실제로 사용하는 일본어의 기호 문자 또는 HiraKakuProN-W3을 표시하면 사용자가 입력 할 때 해당 문자가 표시되지 않습니다.

의 당신이 있다고 가정 해 봅시다 같은 텍스트 : fdsafd [☀] SFDS ‡ [☀☀☀] [日本語] ...

텍스트 필드에, 그리고 구문에서 착색 사이를 전환 할 것을 붙여 넣을 경우 팝업이이 라인, oldRecolorRange:를 호출 : 내가 기대하는 것처럼

다음
[[textView textStorage] replaceCharactersInRange: range withAttributedString: vString]; 

는 상황이 동작합니다. ASCII 텍스트, 기호 및 일본어 텍스트가 모두 표시됩니다. [텍스트 뷰 textStorage]의 값은 밖으로 시작하고,이 같은 끝 : 를 (이것은 GDB의 출력, 그것은 유니 코드 문자가 표시되지 않는 것, 그것에 대해 걱정하지 마십시오.)

 
df{ 
    NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33"; 
}?{ 
    NSFont = "ZapfDingbatsITC 20.00 pt. P [] (0x001ae720) fobj=0x001bb370, spc=5.56"; 
}fdsafd[{ 
    NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33"; 
}?{ 
    NSFont = "HiraKakuProN-W3 20.00 pt. P [] (0x001b59e0) fobj=0x001bb600, spc=6.66"; 
}]sfds[{ 
... 

. .. 심지어 새 값을 설정 한 후 즉

 
dffdsafd[?]sfds[???][???] Nihddfdfffdfdd{ 
    NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33"; 
} 

을로,이 문자열을 표시하는 데 필요한 "외국"글꼴은 글꼴이 대체 문자열에 지정되지 않은 경우에도 자동으로 어떻게 든 유지됩니다.

한 번에 하나 개의 문자를 입력 할 때

그러나,이 방법에 replaceCharactersInRange:withAttributedString: 다른 통화의 기본 글꼴 인 기인 문자열 recolorRange: 결과 - 아니 외국 문자 글꼴이 추가되었습니다 우리는 주 글꼴의 범위를 벗어난 문자를 전혀 볼 수 없습니다!

왜이 방법이 한 가지 경우에만 작동하고 다른 방식으로 작동하지 않는지 알고 싶습니다. NSTextStorage/NSAttributedString에 외국 문자를 표시하려는 힌트를주기 위해 사용할 수있는 스위치가 있습니까?

답변

4

시도 [[textView textStorage] fixFontAttributeInRange : range]; recolorRange :

에있는 [textView textStorage] replaceCharactersInRange : range withAttributedString : vString] 이후에 이미 편집의 끝에있는 processEditing에 대한 응답으로 텍스트 저장 공간을 다시 편집하는 것이 문제라고 생각합니다. - [NSTextStorage processEditing]은 fixFontAttributeInRange :를 사용합니다. 그러나 다시 편집하려고하기 때문에 무언가가 잘못되어 수정 동작이 중단됩니다.

전체 문서에 대해 수행 할 때 정상적인 beginEditing/endEditing/processEditing 시퀀스가 ​​있으며 이로 인해 fixFontAttributeInRange :가 행복하게 호출됩니다.

+0

그랬습니다! docs에서 : "aRange에서 글꼴 속성을 수정하고 스크립트에 잘못된 글꼴이있는 문자에 기본 글꼴을 할당하고 글꼴 속성 할당을 수정하십시오." 감사합니다. – danwood