首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义macOS VoiceOver rotor不会选择NSTextView中的最后一个文本范围

自定义macOS VoiceOver rotor不会选择NSTextView中的最后一个文本范围
EN

Stack Overflow用户
提问于 2020-12-16 19:01:46
回答 1查看 58关注 0票数 0

我正在尝试创建一个自定义转子,以便在文本视图中选择多个范围中的一个。这方面的应用程序接口没有文档(尽管是公开的),所以我从苹果的示例代码here中对其进行了修改。

代码的目的是提供一种方法,通过选择上一个命令或“移动”来导航游戏文本的历史记录。这些值被存储为NSRange值对象的NSArray。

我得到了范围列表,但是如果我选择了最后一个范围,实际文本视图中的相应范围将不会被选中。其余部分则按预期工作。如果我切换到另一个应用程序,然后返回,那么它会突然工作,至少在我键入另一个命令之前是这样。

下面是代码示例。context here中的原始代码。说明问题here的视频。

代码语言:javascript
复制
- (NSAccessibilityCustomRotorItemResult *)rotor:(NSAccessibilityCustomRotor *)rotor
                      resultForSearchParameters:(NSAccessibilityCustomRotorSearchParameters *)searchParameters {

    NSAccessibilityCustomRotorItemResult *searchResult = nil;
    NSAccessibilityCustomRotorItemResult *currentItemResult = searchParameters.currentItem;
    NSAccessibilityCustomRotorSearchDirection direction = searchParameters.searchDirection;
    NSRange currentRange = currentItemResult.targetRange;

    NSUInteger currentItemIndex;

    GlkTextBufferWindow *largest = [self largestWithMoves];

    if (!largest)
        return nil;

    NSArray *children = largest.moveRanges;

    currentItemIndex = [children indexOfObject:[NSValue valueWithRange:currentRange]];

    if (currentItemIndex == NSNotFound) {
        // Find the start or end element.
        if (direction == NSAccessibilityCustomRotorSearchDirectionNext) {
            currentItemIndex = 0;
        } else if (direction == NSAccessibilityCustomRotorSearchDirectionPrevious) {
            currentItemIndex = children.count - 1;
        }
    } else {
        if (direction == NSAccessibilityCustomRotorSearchDirectionPrevious) {
            if ((NSInteger)currentItemIndex == 0) {
                currentItemIndex = NSNotFound;
            } else {
                currentItemIndex--;
            }
        } else if (direction == NSAccessibilityCustomRotorSearchDirectionNext) {
            if (currentItemIndex == children.count - 1) {
                currentItemIndex = NSNotFound;
            } else {
                currentItemIndex++;
            }
        }
    }

    if (currentItemIndex == NSNotFound) {
        return nil;
    }

    NSValue *targetRangeValue = children[(NSUInteger)currentItemIndex];

    if (targetRangeValue) {
        NSRange textRange = targetRangeValue.rangeValue;
        searchResult = [[NSAccessibilityCustomRotorItemResult alloc] initWithTargetElement: largest.textview];
        searchResult.targetRange = textRange;
        // By adding a custom label, all ranges are reliably listed in the rotor
        NSString *label = [largest.textview.string substringWithRange:textRange];
        searchResult.customLabel = label;
    }

    return searchResult;
}
EN

回答 1

Stack Overflow用户

发布于 2021-02-23 04:15:29

我的猜测是您传递的文本范围超出了范围。例如,下面是我使用命令历史菜单时看到的内容。注意"x Closed.",这是不正确的。它应该是“关闭邮箱”。

这种情况也并不总是发生。我可以在一些(大多数?)中选择转子的最后一个命令。案例。因此,我会仔细查看范围,并将有效和无效的范围进行比较。

还请注意下图中重复的初始命令,而不是"walk up to front door“命令。因此,当前实现中存在一些不同的错误,这些错误可能会导致您所看到的行为。

感谢您抽出时间来支持VoiceOver!这是一个完美的项目。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65321981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档