所以我试图让我的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轴值。
在大多数情况下,如果您在应用 last 样式的位置之前在文档中进行编辑,则此问题不会显示,下面是一个示例。在这里我刚刚删除了'g',但插入符号很好。因此,唯一的问题是在 last stlyed文本内或之后进行编辑。
很抱歉这个问题有点长,但请问我是否遗漏了任何东西。谢谢你的帮助!
答案 0 :(得分:1)
好的,我已经找到了解决方案:
我从parse
方法调用了我的-textStorageWillProcessEditing:
方法,由于某种原因,NSAttributedString不喜欢它的属性被实时修改。因此,使用-performSelector:withObject:afterDelay
以{0.0}的延迟调用parse
选择器可以解决问题。
但是,在延迟选择器中编辑NSTextStorage
的属性会导致-textStorageWillProcessEditing:
选择器一次又一次地被调用。因此,当内容已经完全解析时,您必须使用不执行解析的算法进行检查。