なぜん - [NSTextStorage replaceCharactersInRange:withAttributedStringは:]時々、時には他の文字セットのフォントを尊重していませんか?
-
21-08-2019 - |
質問
私はUKSyntaxColoredTextDocument 0.4で問題を診断しようとしているのhttp:/ /www.zathras.de/angelweb/blog-uksctd-oh-four.htm の入力時に実際にあなたが指定したものとは異なるフォントに住んでいるテキストが消えます。 (あなたが...自分のために、この問題を表示するには、このクールなユーティリティをダウンロードして試してみることができます)。
ここで背景だ:これは、あなたが入力として復色するいくつかの構文の色分けコードです。それは素晴らしい作品が、あなたは、例えば、テキストビュー(例えばモナコ、Helveticaの)のためのフォントセット...の一部ではないいくつかの文字を入力すると、実際にZapfDingbatsITCのようなフォントを使用し、日本での記号文字か何か、またはHiraKakuProN-W3は、あなたが入力すると、それらの文字が表示されていない、それを表示します。
あなたが持っているとしましょう。このようないくつかのテキスト:fdsafd [☀]積層欠陥‡[☀☀☀] [日本語] ...
あなたがテキストフィールドにあることを貼り付け、ポップアップからカラーリング構文を切り替える場合は、これはこのラインで、oldRecolorRange:
を呼び出します:
[[textView textStorage] replaceCharactersInRange: range withAttributedString: vString];
ここでは、物事は私が期待するように動作します。 ASCIIテキスト、シンボル、および日本語のテキストはすべて表示されます。 [TextViewのtextStorage]の値が出て始まり、終わる、このような何か:(これは、GDBの出力であり、それは、Unicode文字を示していない、そのことについて心配しないでください。)
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"; }
つまり、この文字列を表示するために必要な「外来」フォントは、フォントが置換文字列で指定されていない場合でも、何とか自動的に保存されます。
ただし、一度に1つの文字で入力すると、ベースフォントでののみのある属性付き文字列内のメソッドreplaceCharactersInRange:withAttributedString:
結果のrecolorRange:
の異なるコール - ノー外国文字フォント私たちのために加え、その主なフォントの範囲外の文字が全く表示されませんされています!
dffdsafd[?]sfds[???][???] Nihddfdfffdfddx{ NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33"; }
この方法は、1つの状況ではなく、別の1つの方法を働いてしまう理由を任意のアイデア?私たちは、テキストは、外国文字を表示したいヒントをNSTextStorage
/ NSAttributedString
を与えることを渡すことができ、スイッチのいくつかの種類がありますか?
解決
[のTextView textStorage] fixFontAttributeInRange:範囲]を試してみてください。後に[のTextView textStorage] replaceCharactersInRange:範囲withAttributedString:VSTRING] recolorRangeで
私はこの問題はすでに編集のテールエンドでprocessEditingに応答して、再びテキストストレージを編集していると思います。 - [NSTextStorage processEditing]はfixFontAttributeInRangeを使用しています:、しかし、あなたがもう一度編集しようとしていることから、何かが間違って起こっていると、修正動作がドロップされます。
あなたは文書全体のためにそれを行うと、、fixFontAttributeInRange原因通常beginEditing / endEditing / processEditingシーケンスがある:。楽しそう呼ばれるように、