2016-01-12 42 views
0

我正在編寫一個庫,我想將自定義屬性添加到現有的React Native視圖中,這些視圖將由我的庫處理。因此,例如React原生視圖的自定義屬性

<View my_custom_property=「something」> 
    <TextView my_custom_property=「something_else」>Hello</TextView> 
</View> 

而且我想我objc庫訪問UIViewRCTView這個屬性被應用到。有人有主意嗎?

回答

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一個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一個陣營本土元素是有用的。這不完全是我最初的問題所要求的,然而,它是完成同樣事情的一種迂迴方式。

+0

我做同樣的事情。但有時UIBlock將不會執行,直到調用此函數後的下一次用戶交互。你以前見過嗎? –