2009-03-24 5 views
4

私はUKSyntaxColoredTextDocument 0.4 http://www.zathras.de/angelweb/blog-uksctd-oh-four.htmの問題を診断しようとしています。実際に入力したフォントと異なるフォントで実際に存在するテキストは、入力すると消えます。 (このクールなユーティリティをダウンロードして試してみてください...)なぜ[ - [NSTextStorage replaceCharactersInRange:withAttributedString:]が時には、他の文字セットのフォントを尊重しないのですか?

これは背景です。これは入力時に暗くなる色分けのコードです。それは素晴らしいですが、そのテキストビュー(例えばMonaco、Helvetica)のフォントセットの一部ではないいくつかの文字を入力した場合...例えば、ZapfDingbatsITCのようなフォントを実際に使用する記号文字または日本語のもの平仮名-W3を表示すると、入力時にそれらの文字は表示されません。

のは、あなたがこのようないくつかのテキストを持っているとしましょう:fdsafd [☀]積層欠陥の‡[☀☀☀] [日本語] ...

あなたがテキストフィールドにあることを貼り付け、シンタックスの色を切り替える場合ポップアップには、これはこのラインで、oldRecolorRange:を呼び出す:私は期待してここ

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

、物事が動作します。 ASCIIテキスト、シンボル、および日本語のテキストがすべて表示されます。 (。;それはUnicode文字を示していない、そのことについて心配しないでください。これは、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[{ 
... 

:[TextViewにtextStorage]の値は、このような何かを開始し、終了します。 ...でも、言い換えれば

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

する新しい値を設定した後、この文字列を表示するために必要な「外来」フォントは、フォントが置換文字列で指定されていない場合でも、何とか自動的に保存されています。

一度に1つの文字を入力するとき

しかし、この方法で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

関連する問題