所以我试图让我的 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];
}
}];
}
}
我发现如果我开始向整个字符串添加属性,它会导致这个错误,虽然上面的代码很好地处理了块级元素(即当样式应用于整行时),但如果属性在行内。
一些更有趣的细节:
插入文本时插入符号没有任何问题
如果您删除该行的第一个(也是唯一一个)字符,使其成为空行,则插入点将位于正确的位置
插入符号的列(X 轴)位置始终是正确的,它只有 Y 轴值搞砸了。
在大多数情况下,如果您在应用最后一个样式的位置之前在文档中进行编辑,则不会出现此问题,下面是一个示例。在这里,我刚刚删除了“g”,但插入符号很好。因此,唯一的问题是在最后一个文本内或之后进行编辑。
抱歉这个问题有点长,但请询问我是否遗漏了任何内容。感谢您的帮助!