5

UKSyntaxColoredTextDocument 0.4 http://www.zathras.de/angelweb/blog-uksctd-oh-four.htmで、指定したフォントとは異なるフォントで実際に存在するテキストが消えてしまう問題を診断しようとしています。タイプ。(このクールなユーティリティをダウンロードして試して、この問題を自分で確認できます...)

背景は次のとおりです。これは、入力時に色が変わる構文の色分けコードです。うまく機能しますが、そのテキストビューのフォントセットの一部ではない文字(Monaco、Helveticaなど)を入力した場合...たとえば、ZapfDingbatsITCやHiraKakuProN-W3で表示すると、入力時にそれらの文字は表示されません。

次のようなテキストがあるとします:fdsafd[☀]sfds‡[☀☀☀][日本語].. ..

これをテキストフィールドに貼り付け、ポップアップから構文の色分けを切り替えると、次のoldRecolorRange:行でが呼び出されます。

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

ここでは、物事は私が期待するように動作します。ASCIIテキスト、記号、および日本語テキストがすべて表示されます。[textView textStorage]の値は、次のように始まり、最終的には次のようになります (これは、gdbの出力です。Unicode文字は表示されません。心配しないでください)。

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

...新しい値をに設定した後でも

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

つまり、この文字列を表示するために必要な「外部」フォントは、置換文字列でフォントが指定されていなくても、何らかの方法で自動的に保持されます。

ただし、一度に1文字ずつ入力するとreplaceCharactersInRange:withAttributedString:、メソッドで別の呼び出しを行うと、ベースフォントのみrecolorRange:の属性付き文字列が生成されます。外国文字フォントは追加されていないため、メインフォントの範囲はまったく表示されません!

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

この方法が、ある状況ではある状況では機能し、別の状況では機能しない理由はありますか?テキストに外国文字を表示させたいというヒントをNSTextStorage/に与えるために渡すことができるある種のスイッチはありますか?NSAttributedString

4

1 に答える 1

6

[[textView textStorage] fixFontAttributeInRange:range]; を試してください。recolorRange の [[textView textStorage] replaceCharactersInRange: range withAttributedString: vString] の後:

問題は、すでに編集の最後尾である processEditing に応答して、テキスト ストレージを再度編集していることだと思います。- [NSTextStorage processEditing] は fixFontAttributeInRange: を使用していますが、再度編集しようとしているため、何かがうまくいかず、修正動作がドロップされています。

ドキュメント全体に対してこれを行うと、正常に呼び出される fixFontAttributeInRange: を引き起こす通常の beginEditing/endEditing/processEditing シーケンスがあります。

于 2009-03-24T19:52:51.700 に答える