React Native Views上的自定义属性

时间:2016-01-12 18:31:03

标签: react-native

我正在编写一个库,我想将自定义属性添加到现有的React Native视图中,这些视图将由我的库处理。例如,

UIView

我希望我的objc库能够访问要应用此属性的RCTView或{{1}}。有人有什么想法吗?

1 个答案:

答案 0 :(得分:1)

好的,这是我可以提供的最佳解决方案。我使用findNodeHandle将元素的标识符传递给我的RCTBridgeModule,然后使用RCTUIManager获取UIView

在我的index.ios.js中(或者你想要访问该元素的任何地方),我将创建对我的元素的引用,并通过调用findNodeHandle来传递该元素的ID桥模块。

var React = require('react-native');
var { findNodeHandle } = React;
const MyCustomBridge = React.NativeModules.MyCustomBridge;

var TestFairy = React.createClass({
  componentDidMount: function() {
    MyCustomBridge.something(findNodeHandle(this.refs.instructions));
  },

  render: function() {
    return (
        <Text style={styles.instructions} ref="instructions">Hello</Text>
    );
  }
});

然后在RCTMyCustomBridge.m中,我会使用findNoderHandle将从RCTUIManager#addUIBlock收到的ID转换为UIView。重要的是你在正确的线程上调用该方法,所以我使用RCTUIManager#methodQueue并调用dispatch_async

RCT_EXPORT_METHOD(something:(nonnull NSNumber *)reactTag) {
    dispatch_async(_bridge.uiManager.methodQueue, ^{
        [_bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
            UIView *view = viewRegistry[reactTag];
            if (view != nil) {
                // Do the magic!
            }
        }];
    });
}

希望这对尝试访问React Native元素的基础UIView的人有用。这不是我最初的问题所要求的,但是,这是一种完成同样事情的迂回方式。