好的,这是我可以提供的最佳解决方案。我使用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
一个UIView ID。重要的是你在正确的线程上调用该方法,所以我使用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!
}
}];
});
}
但愿这是有人试图访问的基本UIView
一个阵营本土元素是有用的。这不完全是我最初的问题所要求的,然而,它是完成同样事情的一种迂回方式。
我做同样的事情。但有时UIBlock将不会执行,直到调用此函数后的下一次用户交互。你以前见过吗? –