gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:53:00 25 4
gpt4 key购买 nike

所以我试图让我的 NSTextView 语法突出显示一些 Markdown 。它看起来像这样:

enter image description here

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

enter image description here

有谁知道这是怎么回事吗?

在我的 - (void)textStorageDidProcessEditing:(NSNotification *)notification 委托(delegate)中,我正在执行文本的完整解析,并且我有一个包含如下条目的字典:

@"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];
}
}];
}
}

我发现,如果我开始向整个字符串添加属性,就会导致此错误,而上面的代码处理 block 级元素(即,当样式应用于整行时) )好吧,如果属性在行内,它会重新出现此问题。

一些更有趣的细节:

  • 插入文本时插入符号没有任何问题

  • 如果删除该行中的第一个(也是唯一一个)字符,使其成为空行,插入点将占据正确的位置

  • 插入符号的列(X 轴)位置始终正确,只是 Y 轴值困惑。

  • 大多数情况下,如果您在应用 last 样式的位置之前在文档中进行编辑,则不会出现此问题,下面是一个示例。这里我刚刚删除了“g”,但插入符号很好。因此,唯一的问题是在最后编辑的文本内或之后进行编辑时。 enter image description here

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

最佳答案

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

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

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

关于cocoa - 删除后插入点未显示在正确的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20258455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com