我不确定我做错了什么。我有一个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
无效。
答案 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)];
}
}