Setting accessibility identifier programmatically on UIBarButtonItem
Solution 1
You could subclass UIBarButtonItem
and implement the UIAccessibilityIdentification
protocol in that subclass, lets's say BarButtonWithAccesibility
.
In BarButtonWithAccesibility.h
:
@interface BarButtonWithAccesibility : UIBarButtonItem<UIAccessibilityIdentification>
@property(nonatomic, copy) NSString *accessibilityIdentifier NS_AVAILABLE_IOS(5_0);
The only (strict) requirement for adhering to this protocol is defining the accessibilityIdentifier
property.
Now in your view controller, let's say in viewDidLoad
, you could set up a UIToolbar and add your subclassed UIBarButtonItem:
#import "BarButtonWithAccesibility.h"
- (void)viewDidLoad{
[super viewDidLoad];
UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
BarButtonWithAccesibility *myBarButton = [[BarButtonWithAccesibility alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(buttonPressed:)];
myBarButton.accessibilityIdentifier = @"I am a test button!";
toolbar.items = [[NSArray alloc] initWithObjects:myBarButton, nil];
[self.view addSubview:toolbar];
}
And within the buttonPressed:
you could verify that you have access to the accessibilityIdentifier
:
- (void)buttonPressed:(id)sender{
if ([sender isKindOfClass:[BarButtonWithAccesibility class]]) {
BarButtonWithAccesibility *theButton = (BarButtonWithAccesibility *)sender;
NSLog(@"My accesibility identifier is: %@", theButton.accessibilityIdentifier);
}
}
Hope this helps.
Solution 2
As of iOS 5 you can do it like this:
UIBarButtonItem *btn = [[UIBarButtonItem alloc] init...;
btn.accessibilityLabel = @"Label";
Solution 3
If you have UIToolbar
created inside that if you want to create multiple UIBarButtonItem
programatically then it can be accessed like that and set accessibilityLabel
as well like that below:-
-(void)viewDidAppear:(BOOL)animated
{
UIBarButtonItem *infoButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"info" style:UIBarButtonItemStyleBordered target:self action:@selector(infoButtonClicked)];
[self.customToolBar setItems:[NSArray arrayWithObject:infoButtonItem]];
//Here if you have muliple you can loop through it
UIView *view = (UIView*)[self.customToolBar.items objectAtIndex:0];
[view setAccessibilityLabel:NSLocalizedString(@"Test", @"")];
}
Solution 4
The subclassing UIBarButtonItem
is a good solution. Depending on your needs, though, it may make more sense to simply assign the accessibilityIdentifier
to the custom image of your UIBarButtonItem
, assuming your UIBarButtonItem
uses a custom image.
Related videos on Youtube
Comments
-
Chris almost 4 years
The accessibility identifier is a developer generated ID for GUI objects, which can be used for automation tests.
A
UIBarButtonItem
does not implementUIAccessibilityIdentification
. However is there a possibility that I can assign an accessibility identifier? -
Chris over 10 yearsIs the accessibility identifier the same as label?
-
Stas Zhukovskiy over 10 yearsnot sure what you mean, but i'll give it a try: by default it's nil, you have to set it yourself.
-
Aklesh Rathaur over 10 yearsu can use tag instead accessibility and also get object from tag.
-
tyler almost 10 yearsThe identifier is not the same as the label. If I'm localizing the element then the label may change, but you'd want the identifier to stay the same - typical for cases where automated testing uses accessibility to identify UI elements.
-
fabb over 9 yearsLooks like iOS 8 fixed the issue, and
accessibilityIdentifier
can now also be used withUIBarButtonItem
. -
Sandeep over 9 years@fabb - Table view cells are not showing in scripts in iOS 8. Do u have any idea
-
Radek Wilczak about 9 yearsIt's not working with Appium Inspector. It shows 'BarButtonWithAccesibility' (and 'UIBarButtonItem') as 'UIAButton' and it sets name as icon file name.