2017-07-24 26 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”,这会让我回到正确的标签,然后我可以用它来调用该函数。希望我做了一个体面的工作来解释这一点。

相关问题