【发布时间】:2013-11-28 05:35:56
【问题描述】:
所以我试图让我的 NSTextView 语法高亮一些降价。这是它的样子:
但是当我按下删除键时,会发生这种情况:
有人知道怎么回事吗?
在我的- (void)textStorageDidProcessEditing:(NSNotification *)notification 委托中,我正在执行文本的完整解析,并且我有一个包含以下条目的字典:
@"paragraph": @{NSFontAttributeName: bodyFont,
NSUnderlineStyleAttributeName: @(NSUnderlineStyleNone),
NSForegroundColorAttributeName: paragraphColor}
我应用格式的方式是:
- (void) applyThemeIfRequired:(NSDictionary*)token {
NSRange tokenRange = (NSRange)[token[@"range"] rangeValue];
NSRange effectiveRange;
NSTextStorage* storage = _textView.textStorage;
NSDictionary* themeForToken = _theme[token[@"type"]];
if (themeForToken) {
[themeForToken enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
id prop = [storage attribute:key atIndex:tokenRange.location effectiveRange:(NSRangePointer)&effectiveRange];
if (![prop isEqualTo: obj] || ([prop isEqualTo:obj] && NSMaxRange(effectiveRange) < NSMaxRange(tokenRange))) {
[storage addAttribute:key value:obj range:tokenRange];
[storage fixAttributesInRange:tokenRange];
}
}];
}
}
我发现如果我开始为整个字符串添加属性,就会导致这个错误,而上面的代码处理 block level 元素(即当样式应用于整行时) 好吧,如果属性在行内,它会重新出现这个问题。
一些更有趣的细节:
插入文本时插入符号没有任何问题
如果删除该行的第一个(也是唯一一个)字符,使其成为空行,则插入点将位于正确位置
插入符号的列(X 轴)位置始终是正确的,只有 Y 轴值搞砸了。
在大多数情况下,如果您在应用 last 样式的位置之前在文档中进行编辑,则不会出现此问题,示例如下.在这里,我刚刚删除了“g”,但插入符号很好。所以,唯一的问题是在last stlyed 文本内或之后进行编辑。
很抱歉这个问题有点长,但请询问我是否遗漏了什么。感谢您的帮助!
【问题讨论】:
标签: cocoa osx-mavericks nstextview nstextstorage