Implement nativeID prop to allow native code to reference react managed views in iOS
Reviewed By: javache Differential Revision: D5228055 fbshipit-source-id: 8c934501d4ac946d80bf93d2ddb50f5fc38aea3c
This commit is contained in:
parent
d217921b5e
commit
70e0455522
|
@ -218,8 +218,6 @@ module.exports = {
|
||||||
* Used to locate this view from native classes.
|
* Used to locate this view from native classes.
|
||||||
*
|
*
|
||||||
* > This disables the 'layout-only view removal' optimization for this view!
|
* > This disables the 'layout-only view removal' optimization for this view!
|
||||||
*
|
|
||||||
* @platform android
|
|
||||||
*/
|
*/
|
||||||
nativeID: PropTypes.string,
|
nativeID: PropTypes.string,
|
||||||
|
|
||||||
|
|
|
@ -179,7 +179,6 @@ const Text = React.createClass({
|
||||||
testID: PropTypes.string,
|
testID: PropTypes.string,
|
||||||
/**
|
/**
|
||||||
* Used to locate this view from native code.
|
* Used to locate this view from native code.
|
||||||
* @platform android
|
|
||||||
*/
|
*/
|
||||||
nativeID: PropTypes.string,
|
nativeID: PropTypes.string,
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -147,6 +147,16 @@ RCT_EXTERN NSString *const RCTUIManagerRootViewKey;
|
||||||
*/
|
*/
|
||||||
- (void)rootViewForReactTag:(NSNumber *)reactTag withCompletion:(void (^)(UIView *view))completion;
|
- (void)rootViewForReactTag:(NSNumber *)reactTag withCompletion:(void (^)(UIView *view))completion;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds a view that is tagged with {@param nativeId} as its nativeID prop
|
||||||
|
* with the associated {@param rootTag} root tag view hierarchy. Returns the
|
||||||
|
* view if found, nil otherwise.
|
||||||
|
*
|
||||||
|
* @param nativeID the id reference to native component relative to root view.
|
||||||
|
* @param rootTag the react tag of root view hierarchy from which to find the view.
|
||||||
|
*/
|
||||||
|
- (UIView *)viewForNativeID:(NSString *)nativeID withRootTag:(NSNumber *)rootTag;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The view that is currently first responder, according to the JS context.
|
* The view that is currently first responder, according to the JS context.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -433,6 +433,33 @@ BOOL RCTIsUIManagerQueue()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO(yuwang): implement the nativeID functionality in a more efficient way
|
||||||
|
* instead of searching the whole view tree
|
||||||
|
*/
|
||||||
|
- (UIView *)viewForNativeID:(NSString *)nativeID withRootTag:(NSNumber *)rootTag
|
||||||
|
{
|
||||||
|
RCTAssertMainQueue();
|
||||||
|
UIView *view = [self viewForReactTag:rootTag];
|
||||||
|
return [self _lookupViewForNativeID:nativeID inView:view];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (UIView *)_lookupViewForNativeID:(NSString *)nativeID inView:(UIView *)view
|
||||||
|
{
|
||||||
|
RCTAssertMainQueue();
|
||||||
|
if (view != nil && [nativeID isEqualToString:view.nativeID]) {
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (UIView *subview in view.subviews) {
|
||||||
|
UIView *targetView = [self _lookupViewForNativeID:nativeID inView:subview];
|
||||||
|
if (targetView != nil) {
|
||||||
|
return targetView;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)setSize:(CGSize)size forView:(UIView *)view
|
- (void)setSize:(CGSize)size forView:(UIView *)view
|
||||||
{
|
{
|
||||||
RCTAssertMainQueue();
|
RCTAssertMainQueue();
|
||||||
|
|
|
@ -114,6 +114,8 @@ RCT_EXPORT_VIEW_PROPERTY(hasTVPreferredFocus, BOOL)
|
||||||
RCT_EXPORT_VIEW_PROPERTY(tvParallaxProperties, NSDictionary)
|
RCT_EXPORT_VIEW_PROPERTY(tvParallaxProperties, NSDictionary)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
RCT_EXPORT_VIEW_PROPERTY(nativeID, NSString)
|
||||||
|
|
||||||
// Acessibility related properties
|
// Acessibility related properties
|
||||||
RCT_REMAP_VIEW_PROPERTY(accessible, reactAccessibilityElement.isAccessibilityElement, BOOL)
|
RCT_REMAP_VIEW_PROPERTY(accessible, reactAccessibilityElement.isAccessibilityElement, BOOL)
|
||||||
RCT_REMAP_VIEW_PROPERTY(accessibilityLabel, reactAccessibilityElement.accessibilityLabel, NSString)
|
RCT_REMAP_VIEW_PROPERTY(accessibilityLabel, reactAccessibilityElement.accessibilityLabel, NSString)
|
||||||
|
|
|
@ -24,6 +24,11 @@
|
||||||
- (void)insertReactSubview:(UIView *)subview atIndex:(NSInteger)atIndex NS_REQUIRES_SUPER;
|
- (void)insertReactSubview:(UIView *)subview atIndex:(NSInteger)atIndex NS_REQUIRES_SUPER;
|
||||||
- (void)removeReactSubview:(UIView *)subview NS_REQUIRES_SUPER;
|
- (void)removeReactSubview:(UIView *)subview NS_REQUIRES_SUPER;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The native id of the view, used to locate view from native codes
|
||||||
|
*/
|
||||||
|
@property (nonatomic, copy) NSString *nativeID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Layout direction of the view.
|
* Layout direction of the view.
|
||||||
* Internally backed to `semanticContentAttribute` property.
|
* Internally backed to `semanticContentAttribute` property.
|
||||||
|
|
|
@ -27,6 +27,16 @@
|
||||||
objc_setAssociatedObject(self, @selector(reactTag), reactTag, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
objc_setAssociatedObject(self, @selector(reactTag), reactTag, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSNumber *)nativeID
|
||||||
|
{
|
||||||
|
return objc_getAssociatedObject(self, _cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setNativeID:(NSNumber *)nativeID
|
||||||
|
{
|
||||||
|
objc_setAssociatedObject(self, @selector(nativeID), nativeID, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
||||||
|
}
|
||||||
|
|
||||||
#if RCT_DEV
|
#if RCT_DEV
|
||||||
|
|
||||||
- (RCTShadowView *)_DEBUG_reactShadowView
|
- (RCTShadowView *)_DEBUG_reactShadowView
|
||||||
|
|
Loading…
Reference in New Issue