我正在尝试创建一个自定义转子,以便在文本视图中选择多个范围中的一个。这方面的应用程序接口没有文档(尽管是公开的),所以我从苹果的示例代码here中对其进行了修改。
代码的目的是提供一种方法,通过选择上一个命令或“移动”来导航游戏文本的历史记录。这些值被存储为NSRange值对象的NSArray。
我得到了范围列表,但是如果我选择了最后一个范围,实际文本视图中的相应范围将不会被选中。其余部分则按预期工作。如果我切换到另一个应用程序,然后返回,那么它会突然工作,至少在我键入另一个命令之前是这样。
下面是代码示例。context here中的原始代码。说明问题here的视频。
- (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;
}发布于 2021-02-23 04:15:29
我的猜测是您传递的文本范围超出了范围。例如,下面是我使用命令历史菜单时看到的内容。注意"x Closed.",这是不正确的。它应该是“关闭邮箱”。

这种情况也并不总是发生。我可以在一些(大多数?)中选择转子的最后一个命令。案例。因此,我会仔细查看范围,并将有效和无效的范围进行比较。
还请注意下图中重复的初始命令,而不是"walk up to front door“命令。因此,当前实现中存在一些不同的错误,这些错误可能会导致您所看到的行为。
感谢您抽出时间来支持VoiceOver!这是一个完美的项目。
https://stackoverflow.com/questions/65321981
复制相似问题