0

所以我试图让我的 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”,但插入符号很好。因此,唯一的问题是在最后一个文本内或之后进行编辑。 在此处输入图像描述

抱歉这个问题有点长,但请询问我是否遗漏了任何内容。感谢您的帮助!

4

1 回答 1

1

好的,所以我想出了解决方案:

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

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

于 2013-11-29T04:41:09.490 回答