Cocoa 删除后插入点未显示在正确位置
所以我试图让我的NSTextView语法突出显示一些标记。下面是它的样子: 但当我按delete键时,会发生以下情况: 有人知道发生了什么事吗 在我的Cocoa 删除后插入点未显示在正确位置,cocoa,osx-mavericks,nstextview,nstextstorage,Cocoa,Osx Mavericks,Nstextview,Nstextstorage,所以我试图让我的NSTextView语法突出显示一些标记。下面是它的样子: 但当我按delete键时,会发生以下情况: 有人知道发生了什么事吗 在我的-(void)textStorageDidProcessEditing:(NSNotification*)notification委托中,我正在执行文本的完整解析,我有一个包含如下条目的字典: @"paragraph": @{NSFontAttributeName: bodyFont, NSUnderlineSt
-(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];
}
}];
}
}
-(void)applyThemeIfRequired:(NSDictionary*)令牌{
NSRange-tokenRange=(NSRange)[token[@“range”]rangeValue];
NSRange有效范围;
NSTextStorage*存储=_textView.textStorage;
NSDictionary*themeForToken=_theme[token[@“type]”;
如果(themeForToken){
[前面的enumerateKeysAndObjectsUsingBlock:^(id键、id对象、布尔*停止){
id prop=[storage属性:key-atIndex:tokenRange.location-effectiveRange:(NSRangePointer)&effectiveRange];
如果(![prop isEqualTo:obj]| |([prop isEqualTo:obj]&&NSMaxRange(effectiveRange)
我发现,如果我开始向整个字符串添加属性,就会导致此错误,而当上面的代码处理块级元素(即,当样式应用于整行时)时,如果属性在行内,则会重新出现此问题
还有一些有趣的细节:
- 插入文本时插入符号没有任何问题
- 如果删除行上的第一个(也是唯一一个)字符,使其成为空行,则插入点将位于正确的位置
- 插入符号的列(X轴)位置始终正确,只有Y轴的值会出错
- 在大多数情况下,如果您在应用上一个样式的位置之前在文档中进行编辑,则不会出现此问题,下面是一个示例。在这里,我刚刚删除了“g”,但插入符号很好。因此,唯一的问题是在最后一个STLYD文本内或之后进行编辑时。
对不起,这个问题有点长,但一定要问我是否遗漏了什么。谢谢你的帮助 好的,我已经想出了解决办法: 我从
-textStorageWillProcessEditing:
方法调用了我的parse
方法,出于某种原因,NSAttributedString不喜欢实时修改其属性。因此,使用-performSelector:withObject:afterDelay
以0.0的延迟调用解析
选择器可以解决问题
但是,在延迟选择器中编辑NSTextStorage
的属性会导致反复调用-textStorageWillProcessEditing:
选择器。因此,您必须使用在内容已完全解析时不执行解析的算法进行检查