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

时间:2013-11-28 05:35:57

标签: cocoa osx-mavericks nstextview nstextstorage

所以我试图让我的NSTextView语法突出显示一些降价。这是它的样子:

enter image description here

但是当我按下删除键时,会发生这种情况:

enter image description here

有谁知道发生了什么事?

在我的- (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文本内或之后进行编辑。 enter image description here

很抱歉这个问题有点长,但请问我是否遗漏了任何东西。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

好的,我已经找到了解决方案:

我从parse方法调用了我的-textStorageWillProcessEditing:方法,由于某种原因,NSAttributedString不喜欢它的属性被实时修改。因此,使用-performSelector:withObject:afterDelay以{0.0}的延迟调用parse选择器可以解决问题。

但是,在延迟选择器中编辑NSTextStorage的属性会导致-textStorageWillProcessEditing:选择器一次又一次地被调用。因此,当内容已经完全解析时,您必须使用不执行解析的算法进行检查。