如何在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属性?
答案 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
该方法。