2017-07-24 24 views
0

我有一個反應原生應用程序,我正在建設,併爲其中的一部分,我已經實現了我自己的自定義模塊(在這種情況下,一個webview)。我已經設置好了,一切正常,直到我在同一個屏幕上渲染兩個相同的模塊。反應本機模塊不能一起工作

一旦我在同一個屏幕上有兩個相同的模塊,Objective-C中調用onChange方法返回到javascript的代碼不再執行,我可以通過Javascript更長的時間與我的模塊通信。

我注意到,我的模塊的每個實例都有一個標籤或類似的東西,但我不知道該怎麼辦才能解決這個問題。

更新

基本上我添加了一些代碼,我可以看到的問題是,當新的模塊添加到屏幕上,它會覆蓋前一個模塊的回調。一旦新模塊離開屏幕,Objective-C中的回調仍然「聚焦」在最近呈現的模塊上...

這可能與此有關嗎?

ReactNative.findNodeHandle(this.refs[WEB_VIEW]); 

編輯

我一直在找過一些開源代碼,我想我已經縮小的問題。基本上我的模塊由WebView和WebViewManager組成。 WebViews非常簡單,僅顯示網頁內容等,管理員負責控制其行爲。

scrollToTop() { 
    RNTWebViewManager.scrollToTop(); 
} 

在該管理器將然後調用相應的方法:

當我想打電話從陣營本地模塊上的方法,我可以通過調用這樣的WebViewManager方法這樣做Objective-C的。但是,似乎一次在屏幕上顯示多個WebView實例時,管理者不知道要調用哪個實例,而是要求調用放置在屏幕上的最新實例。

在開源項目中,我看到他們通過傳遞來獲得特定的視圖標籤,然後由經理用它來調用他們的WebViews的正確實例,但我仍然試圖瞭解如何實現這一點。

這裏是下面的項目,我一直在尋找的鏈接: https://github.com/CRAlpha/react-native-wkwebview

+0

你需要發佈一些代碼或沒有人能夠提供幫助。 –

+0

不幸的是,沒有太多的代碼發佈... – Asleepace

+0

好的東西,而不僅僅是解釋。例如,*「我已經實現了我自己的自定義模塊(在本例中是一個webview)。」*或*「Objective-C中的代碼將onChange方法調用回javascript」*或者你的意思是「*我注意到我的模塊的每個實例都有一個標籤或類似的東西「*。所有這些將是一個開始。 –

回答

0

好了,所以以後相當長的一段時間,研究我終於想通了解決方案。基本上它與確保正確的組件從React Native和Objective-C被調用有關。例如,在你的反應天然成分,你有一個函數:

executeJavascript(tag,js) { 
    RNTWebViewManager.executeJavascript(tag,js); 
} 

然後在你的Objective-C的實施RNTWebViewManager的,你可以有這樣的事情:

RCT_EXPORT_METHOD(executeJavascript:(nonnull NSNumber *)reactTag with:(NSString *)js) 
{ 
    [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, RNWebView *> *viewRegistry) { 
    RNWebView *view = viewRegistry[reactTag]; 
    [view evaluateJavaScript:js completionHandler:^(id _Nullable result, NSError * _Nullable error) { 
     if (result == nil) { result = @""; } 
     id outputError = (error) ? error.description : @""; 
     view.onChange(@{ @"result" : result, @"error": outputError, @"type" : @"javascript" }); 
    }]; 
    }]; 
} 

注意如何executeJavascript功能需要標記,這是您嘗試調用該方法的當前視圖的引用。因此,基本上所有你需要做的是通過該標籤號碼,只要你想在一個特定的實例,你可以得到像這樣執行的方法:

getTag() { 
    return ReactNative.findNodeHandle(this.refs['RNWebView']); 
} 

凡在這種情況下,裁判是「RNWebView」,這會讓我回到正確的標籤,然後我可以用它來調用該函數。希望我做了一個體面的工作來解釋這一點。

相關問題