2

何が間違っているのかわかりません。私は NSTextView を持っており、その textStorage 属性のデリゲートとして登録されています。受け取っ-textStorageDidProcessEditing:notification:たら、テキスト内の文字の範囲に属性を適用しようとしています。それは確かにキャラクターに「何か」をしますが、私が期待するものではありません...彼らはただ消えます!

高度に抽出されたコード例。これにより、テキスト フィールドの 2 番目の文字が常に赤になります。

-(void)textStorageDidProcessEditing:(NSNotification *)notification {
  NSTextStorage *textStorage = [textView textStorage];
  if ([[textStorage string] length] > 1) {
    NSColor *color = [NSColor redColor];
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:color, NSForegroundColorAttributeName, nil];
    [textStorage setAttributes:attributes range:NSMakeRange(1, 1)];
  }
}

代わりに、シーケンス「abcdefg」を入力すると「a」が表示され、次に「b」を押すと何も起こらないように見えますが、「cdefg」を押すと通常どおり入力が行われ、最終結果は「acdefg」になります... 「b」がありません!

バックスペースを押し始めると、「b」が実際にそこにあるが、描画されていないかのように、バックスペースを7回押す必要があります(「b」を削除するとカーソルが停止し、次のバックスペースで「a」を削除します期待される)。

ビューが描画される前-setAttributes:range:に同じ方法を使用して、ビュー内のデフォルトのテキストに属性を適用すると、期待どおりに動作します。

手がかりはありますか?NSTextStorageDelegate:)のかなり通常の使用のようです。

-setNeedsDisplayテキストフィールドを呼び出してみましたが、役に立ちませんでした。

4

2 に答える 2

4

理解した。NSTextStorageの-addAttribute:value:range作品を使用します。理由はまだ完全にはわかりませんが、少なくともそれを乗り越えて先に進むことができます。

-(void)textStorageDidProcessEditing:(NSNotification *)notification {
  // ... SNIP ...
  [textStorage addAttribute:NSForegroundColorAttributeName
                      value:[NSColor redColor]
                      range:NSMakeRange(1, 1)];
}

コードも少しすっきりします。

于 2010-10-22T01:44:15.117 に答える
0

何年も経った後、これがあなたにとってどれほど関連性があるかはわかりませんが、その理由は、を含まない辞書で属性を設定NSFontAttributeNameし、テキストビューから効果的に削除したためだと思います。

だから私はこれがうまくいくと思う:

-(void)textStorageDidProcessEditing:(NSNotification *)notification {
  NSTextStorage *textStorage = [textView textStorage];
  if ([[textStorage string] length] > 1) {
    NSColor *color = [NSColor redColor];
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:color, NSForegroundColorAttributeName, [NSFont ...whatever...], NSFontAttributeName, nil];
    [textStorage setAttributes:attributes range:NSMakeRange(1, 1)];
  }
}
于 2014-12-13T14:48:23.280 に答える