2

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;
}

問題は、logElementTree()このテーブルビューに対してUIAutomationテストでJavaScriptを呼び出すと、そのセクションヘッダービュー内のテキストコンテンツから派生した名前を持つUIATableGroup要素が返されることです(つまり、UIAccessibilityLabelヒューリスティックにフォールバックします)。そのセクションヘッダーにはセグメント化されたコントロールが含まれているため、一貫性のないaccessibilityLabel値が取得されます。したがって、そのすべてをバイパスして、明示的な識別子を割り当てたいと思っています。

代わりに、自分の明示的なaccessibilityIdentifierをUIATableGroupのnameプロパティとして表示させるにはどうすればよいですか?

4

1 に答える 1

4

返されるビューもで応答することを確認する必要がありisAccessibilityElementますYES。Appleが提供するコアデータブックのサンプルアプリを試すことで、これを解決することができました。

私は次のようなカスタムビューを実装しました:

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;
}

何が起こっているのかというと、アクセシビリティインフラストラクチャがヘッダービューを見て、それが実際にアクセシビリティ要素であると言っている最初のサブビューの「識別子」を取得しようとしていることだと思います。したがって、あなたの場合、セグメント化されたコントロールがに戻っYESisAccessibilityElementいるので、この識別子が公開されるべきものであるというアクセシビリティAPIへのトリガーになります。

したがって、解決策は、カスタム識別子を返すことに加えてUIView、ヘッダーがそのメソッドに戻るときに返されることを確認することです。YES

于 2012-12-31T20:17:42.000 に答える