好的,這是我可以提供的最佳解決方案。我使用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將不會執行,直到調用此函數後的下一次用戶交互。你以前見過嗎? –