Cocoa(Snow Leopard)NSTextView的textStorage -setAttributes:range:删除字符!

时间:2010-10-21 21:40:43

标签: cocoa macos nstextfield appkit

我不确定我做错了什么。我有一个NSTextView,并注册为其textStorage属性的委托。当我收到-textStorageDidProcessEditing:notification:时,我正在尝试将属性应用于文本中的字符范围。它肯定对角色有“某些东西”,但不是我所期待的......它们只是消失了!

一个经过深思熟虑的代码示例。这应该确保文本字段中的第二个字符始终为红色:

-(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”缺失了!

如果我开始击退退格,我必须按退格7次,好像“b”实际上在那里,但是没有被绘制(光标在删除“b”时停止,然后在下一个退格时删除“ “如预期的那样。”

如果我在视图被绘制之前使用相同的-setAttributes:range:方法在视图中将属性应用于某些默认文本,那么它就会完全按照我的预期进行。

任何线索?这似乎是NSTextStorageDelegate:)

的正常使用

我尝试在文本字段上调用-setNeedsDisplay无效。

2 个答案:

答案 0 :(得分:4)

想出来。使用NSTextStorage的-addAttribute:value:range有效。我仍然不完全理解为什么,但至少我可以克服并继续前进。

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

使代码也不那么混乱。

答案 1 :(得分:0)

我不确定这么多年后这对你有多重要,但我认为原因是你用一个不包含NSFontAttributeName的词典设置属性,有效地将其从textview中删除。

所以我认为这应该有效:

-(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)];
  }
}