Skip to content

Commit 9261035

Browse files
janicduplessisfacebook-github-bot
authored andcommitted
Move accessibility props to UIView+React (#24743)
Summary: React Native Gesture Handler uses a `RCTViewManager` subclass to manage `UIControl` so the cast to set accessibility props is not safe. This moves the accessibility props we set to `UIView+React` so they can be used safely on any `UIView`. ![image](https://user-images.githubusercontent.com/2677334/57042641-46e42700-6c33-11e9-9a97-76661ad5d14d.png) [General] [Fixed] - Move accessibility props to UIView+React Pull Request resolved: #24743 Differential Revision: D15258062 Pulled By: cpojer fbshipit-source-id: 4a25b79407e5cb7b3b368c7506161e989794bb26
1 parent b4b9c0f commit 9261035

File tree

5 files changed

+45
-15
lines changed

5 files changed

+45
-15
lines changed

React/Views/RCTView.h

-7
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,6 @@ extern const UIAccessibilityTraits SwitchAccessibilityTrait;
2828
@property (nonatomic, copy) RCTDirectEventBlock onMagicTap;
2929
@property (nonatomic, copy) RCTDirectEventBlock onAccessibilityEscape;
3030

31-
/**
32-
* Accessibility properties
33-
*/
34-
@property (nonatomic, copy) NSArray <NSString *> *accessibilityActions;
35-
@property (nonatomic, copy) NSString *accessibilityRole;
36-
@property (nonatomic, copy) NSArray <NSString *> *accessibilityStates;
37-
3831
/**
3932
* Used to control how touch events are processed.
4033
*/

React/Views/RCTView.m

+5-5
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,12 @@ - (NSString *)accessibilityLabel
158158

159159
- (NSArray <UIAccessibilityCustomAction *> *)accessibilityCustomActions
160160
{
161-
if (!_accessibilityActions.count) {
161+
if (!self.accessibilityActions.count) {
162162
return nil;
163163
}
164164

165165
NSMutableArray *actions = [NSMutableArray array];
166-
for (NSString *action in _accessibilityActions) {
166+
for (NSString *action in self.accessibilityActions) {
167167
[actions addObject:[[UIAccessibilityCustomAction alloc] initWithName:action
168168
target:self
169169
selector:@selector(didActivateAccessibilityCustomAction:)]];
@@ -189,7 +189,7 @@ - (BOOL)didActivateAccessibilityCustomAction:(UIAccessibilityCustomAction *)acti
189189
- (NSString *)accessibilityValue
190190
{
191191
if ((self.accessibilityTraits & SwitchAccessibilityTrait) == SwitchAccessibilityTrait) {
192-
for (NSString *state in _accessibilityStates) {
192+
for (NSString *state in self.accessibilityStates) {
193193
if ([state isEqualToString:@"checked"]) {
194194
return @"1";
195195
} else if ([state isEqualToString:@"unchecked"]) {
@@ -231,11 +231,11 @@ - (NSString *)accessibilityValue
231231
@"collapsed" : @"collapsed",
232232
};
233233
});
234-
NSString *roleDescription = _accessibilityRole ? roleDescriptions[_accessibilityRole]: nil;
234+
NSString *roleDescription = self.accessibilityRole ? roleDescriptions[self.accessibilityRole]: nil;
235235
if (roleDescription) {
236236
[valueComponents addObject:roleDescription];
237237
}
238-
for (NSString *state in _accessibilityStates) {
238+
for (NSString *state in self.accessibilityStates) {
239239
NSString *stateDescription = state ? stateDescriptions[state] : nil;
240240
if (stateDescription) {
241241
[valueComponents addObject:stateDescription];

React/Views/RCTViewManager.m

+3-3
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ - (RCTShadowView *)shadowView
174174
view.reactAccessibilityElement.accessibilityTraits |= maskedTraits;
175175
} else {
176176
NSString *role = json ? [RCTConvert NSString:json] : @"";
177-
((RCTView *)view.reactAccessibilityElement).accessibilityRole = role;
177+
view.reactAccessibilityElement.accessibilityRole = role;
178178
}
179179
}
180180

@@ -200,9 +200,9 @@ - (RCTShadowView *)shadowView
200200
}
201201
}
202202
if (newStates.count > 0) {
203-
((RCTView *)view.reactAccessibilityElement).accessibilityStates = newStates;
203+
view.reactAccessibilityElement.accessibilityStates = newStates;
204204
} else {
205-
((RCTView *)view.reactAccessibilityElement).accessibilityStates = nil;
205+
view.reactAccessibilityElement.accessibilityStates = nil;
206206
}
207207
}
208208

React/Views/UIView+React.h

+7
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,13 @@
113113
*/
114114
@property (nonatomic, readonly) UIView *reactAccessibilityElement;
115115

116+
/**
117+
* Accessibility properties
118+
*/
119+
@property (nonatomic, copy) NSArray <NSString *> *accessibilityActions;
120+
@property (nonatomic, copy) NSString *accessibilityRole;
121+
@property (nonatomic, copy) NSArray <NSString *> *accessibilityStates;
122+
116123
/**
117124
* Used in debugging to get a description of the view hierarchy rooted at
118125
* the current view.

React/Views/UIView+React.m

+30
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,36 @@ - (UIView *)reactAccessibilityElement
297297
return self;
298298
}
299299

300+
- (NSArray<NSString *> *)accessibilityActions
301+
{
302+
return objc_getAssociatedObject(self, _cmd);
303+
}
304+
305+
- (void)setAccessibilityActions:(NSArray<NSString *> *)accessibilityActions
306+
{
307+
objc_setAssociatedObject(self, @selector(accessibilityActions), accessibilityActions, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
308+
}
309+
310+
- (NSString *)accessibilityRole
311+
{
312+
return objc_getAssociatedObject(self, _cmd);
313+
}
314+
315+
- (void)setAccessibilityRole:(NSString *)accessibilityRole
316+
{
317+
objc_setAssociatedObject(self, @selector(accessibilityRole), accessibilityRole, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
318+
}
319+
320+
- (NSArray<NSString *> *)accessibilityStates
321+
{
322+
return objc_getAssociatedObject(self, _cmd);
323+
}
324+
325+
- (void)setAccessibilityStates:(NSArray<NSString *> *)accessibilityStates
326+
{
327+
objc_setAssociatedObject(self, @selector(accessibilityStates), accessibilityStates, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
328+
}
329+
300330
#pragma mark - Debug
301331

302332
- (void)react_addRecursiveDescriptionToString:(NSMutableString *)string atLevel:(NSUInteger)level

0 commit comments

Comments
 (0)