Cocoa 删除后插入点未显示在正确位置

Cocoa 删除后插入点未显示在正确位置,cocoa,osx-mavericks,nstextview,nstextstorage,Cocoa,Osx Mavericks,Nstextview,Nstextstorage,所以我试图让我的NSTextView语法突出显示一些标记。下面是它的样子: 但当我按delete键时,会发生以下情况: 有人知道发生了什么事吗 在我的-(void)textStorageDidProcessEditing:(NSNotification*)notification委托中,我正在执行文本的完整解析,我有一个包含如下条目的字典: @"paragraph": @{NSFontAttributeName: bodyFont, NSUnderlineSt

所以我试图让我的NSTextView语法突出显示一些标记。下面是它的样子:

但当我按delete键时,会发生以下情况:

有人知道发生了什么事吗

在我的
-(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:
选择器。因此,您必须使用在内容已完全解析时不执行解析的算法进行检查