-[NSTextStorage가CharactersInRange를 대체하는 이유:withAttributedString:] 때때로, 때로는 다른 문자 세트의 글꼴을 존중하지 않습니까?

StackOverflow https://stackoverflow.com/questions/678620

  •  21-08-2019
  •  | 
  •  

문제

UKSyntaxColoredTextDocument 0.4의 문제를 진단하려고 합니다. http://www.zathras.de/angelweb/blog-uksctd-oh-four.htm 실제로 지정한 글꼴과 다른 글꼴로 표시된 텍스트는 입력할 때 사라집니다.(이 멋진 유틸리티를 다운로드하여 사용해 보고 이 문제를 직접 확인할 수 있습니다...)

배경은 다음과 같습니다.이것은 입력할 때마다 다시 칠해지는 구문 색상 지정 코드입니다.훌륭하게 작동하지만 해당 텍스트 보기에 설정된 글꼴의 일부가 아닌 일부 문자를 입력하는 경우(예:모나코, 헬베티카)...예를 들어 실제로 ZapfDingbatsITC 또는 HiraKakuProN-W3와 같은 글꼴을 사용하여 표시하는 일본어의 기호 문자나 문자는 입력할 때 표시되지 않습니다.

다음과 같은 텍스트가 있다고 가정해 보겠습니다.fdsafd[☀]sfds‡[☀☀☀][일본어]...

이를 텍스트 필드에 붙여넣고 팝업에서 구문 색상 지정 간에 전환하면 다음이 호출됩니다. oldRecolorRange:, 다음 줄을 사용하세요.

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

여기서는 예상대로 작동합니다.ASCII 텍스트, 기호 및 일본어 텍스트가 모두 표시됩니다.[textView 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: 결과는 다음과 같습니다. 오직 기본 글꼴에 - 외국 문자 글꼴이 추가되지 않았으므로 기본 글꼴 범위를 벗어나는 문자는 전혀 표시되지 않습니다!

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

왜 이 방법이 한 상황에서는 같은 방식으로 작동하고 다른 상황에서는 작동하지 않는지 아시나요?내가 전달할 수있는 스위치가 있습니까? NSTextStorage/NSAttributedString 텍스트에 외국 문자를 표시하고 싶다는 힌트가 있나요?

도움이 되었습니까?

해결책

[[textView textStorage] fixFontAttributeInRange:range]를 시도해 보세요.[[textView textStorage] 교체문자인레인지(replaceCharactersInRange) 이후:속성 문자열이 포함된 범위:recolorRange의 vString]:

문제는 이미 편집의 끝인 processEditing에 대한 응답으로 텍스트 저장소를 다시 편집하는 것이라고 생각합니다.-[NSTextStorage processEditing]은 fixFontAttributeInRange:를 사용하지만 다시 편집하려고 하므로 문제가 발생하여 수정 동작이 중단됩니다.

전체 문서에 대해 이 작업을 수행하면 fixFontAttributeInRange를 발생시키는 일반적인 startEditing/endEditing/processEditing 시퀀스가 ​​있습니다.행복하게 불러야지.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top