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

时间:2012-12-31 17:47:17

标签: uitableview ios6 ios-ui-automation uiaccessibility

如何在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启发式)。因为该节头中有一个分段控件,所以我得到的accessibilityLabel值不一致。因此,我希望绕过所有这一切并分配一个明确的标识符。

如何强制我自己的显式accessibilityIdentifier显示为UIATableGroup的name属性?

1 个答案:

答案 0 :(得分:4)

您必须确保您要返回的视图也会使用isAccessibilityElement响应YES。我通过试验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该方法。