在 UIAutomation 的自定义表格部分标题视图上设置 accessibilityIdentifier

Posted

技术标签:

【中文标题】在 UIAutomation 的自定义表格部分标题视图上设置 accessibilityIdentifier【英文标题】:Set accessibilityIdentifier on custom table section header view for UIAutomation 【发布时间】:2012-12-31 17:47:16 【问题描述】:

如何在 UITableView 中的自定义部分标题视图上设置可访问性标识符?

作为背景,由于在 UIAutomation 中记录表格视图的元素树会生成与表格组元素 (UIATableGroup) 混合的表格单元格(UIATableCell 实例)的平面列表,因此能够识别组可以更容易地识别单元格属于这些组(因为它们是按顺序返回的)。

如果我在作为节标题视图返回的自定义视图上显式设置了accessibilityIdentifier,我可以确认该视图上确实设置了accessibilityIdentifier 属性。

这是提供自定义部分标题视图的方法(当然,它确实显示在我的实际表格视图中):

 - (UIView *)tableView:(UITableView *)tableView 
viewForHeaderInSection:(NSInteger)sectionNumber

    UIView *headerView = [self someMethodToRetrieveHeaderView];

    // This line is logging that indeed, the accessibility identifier is set.
    NSLog(@"Header view accessibility identifier is: '%@' for section number: %d",
     headerView.accessibilityIdentifier, sectionNumber);         
    return headerView;

问题在于,当我在针对此表视图的 UIAutomation 测试中在 javascript 中发出 logElementTree() 调用时,它会返回一个 UIATableGroup 元素,该元素的名称源自该部分标题视图内的文本内容(即下降回到 UIAccessibilityLabel 启发式)。因为该部分标题中有一个分段控件,所以我得到不一致的可访问性标签值。因此,我希望绕过所有这些并分配一个明确的标识符。

如何强制我自己的显式可访问性标识符显示为 UIATableGroup 的 name 属性?

【问题讨论】:

【参考方案1】:

您必须确保您返回的视图也以YES 响应isAccessibilityElement。我可以通过试用 Apple 提供的 core data books 示例应用程序来解决这个问题。

我实现了一个这样的自定义视图:

static int counter = 0;

@interface MyView : UIView
@end

@implementation MyView

- (NSString *)accessibilityIdentifier

    return [NSString stringWithFormat:@"Custom Identifier %d", counter++];


- (BOOL)isAccessibilityElement

    return YES;


@end

然后我将它返回给表视图委托(在这种情况下是表视图控制器):

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

    MyView *v = [[MyView alloc] init];
    return v;

我认为正在发生的事情是可访问性基础结构正在查看标题视图并试图获取第一个子视图的“标识符”,该子视图表明它确实是一个可访问性元素。因此,在您的情况下,分段控件将 YES 返回到 isAccessibilityElement,因此这是对可访问性 API 的触发器,该标识符是应该公开的标识符。

因此,解决方案是确保您作为标头返回的 UIView 除了返回自定义标识符外,还向该方法返回 YES

【讨论】:

谢谢乔纳森。这就是问题所在 - 我需要在用作自定义表节标题的视图上明确地将 isAccessibilityElement 设置为 YES。让我失望的是 UIATableGroup 已经出现在 UIAutomation logElementTree() 调用中,只是带有一个我没想到的值。给我的教训:仅仅因为一个元素出现在自动化方面,并不意味着它将使用您明确设置的标识符,除非您还明确设置了 isAccessibilityElement 标志。 唯一的缺点是我不能再看到该部分标题视图中的元素(来自 Javascript)(即包含在其中的分段控件)。这当然是 ios UIAutomation 的限制。我认为如果要为后者提供良好的服务,Apple 需要将可访问性与自动化分开。 @idStar 你解决了访问header view的子view的问题吗? @almas:在我写完之后不久就不需要尝试了,所以我在这里没有新的见解。我怀疑具有类似 DOM 的新 UI 测试框架会受到同样的限制。但是,如果您发现自己仍然受到限制,我会提交雷达报告。

以上是关于在 UIAutomation 的自定义表格部分标题视图上设置 accessibilityIdentifier的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 处理表格视图多个部分的自定义复选标记按钮状态

AngularJS ng-repeat 与表格内的自定义元素呈现奇怪

带有 IB 的表格视图的自定义标题

UIAutomation iOS - 删除表格单元格

在 iOS UIAutomation 中滚动表格视图时,scrollToVisible 不起作用

如何在 Iphone UIAutomation 中编辑表格时选择 (-) 图标