Ios 我想创建本机模块还是本机UI组件?

Ios 我想创建本机模块还是本机UI组件?,ios,reactjs,react-native,Ios,Reactjs,React Native,我有一个Swift类,它主要像React本地模块一样使用。该模块使用一个不可见的WKWebView来运行,有时我会将该WKWebView指定为我的ViewController中的子视图来调试我的实现,如下所示: swiftClass.webView.frame = self.view.frame self.view.addSubview(swiftClass.webView) 将此功能连接到React Native最简单的方法是什么?我好像坐在一个模块和一个UI组件之间。如果我将其作为UI组件

我有一个Swift类,它主要像React本地模块一样使用。该模块使用一个不可见的WKWebView来运行,有时我会将该WKWebView指定为我的ViewController中的子视图来调试我的实现,如下所示:

swiftClass.webView.frame = self.view.frame
self.view.addSubview(swiftClass.webView)
将此功能连接到React Native最简单的方法是什么?我好像坐在一个模块和一个UI组件之间。如果我将其作为UI组件编写,如何调用该类的方法?如果我将其作为模块编写,如何将其添加到视图层次结构中


我是否应该使用WebView在React Native中重写模块?我不想这样做,因为RN实现使用UIWebView,这比WKWebView慢,我不想污染JS线程,并可能导致任何减速。

所有这些方法都可以工作,但有不同的折衷。我将讨论权衡和细微差别,希望这将帮助您选择一种适合您需求的方法

作为UI组件 桥接UI组件负责创建一个视图,该视图对本机视图层次结构中的本机插入作出反应。卸载React组件后,相应的本机视图将从视图层次结构中删除并释放

所以有一个问题是:为API提供React组件的生命周期有意义吗

此外,在iOS上,React Native实际上会向桥接视图管理器请求一个额外的视图实例。例如,如果JS中有三个桥接组件,React Native将创建四个本机视图实例。额外视图的原因是它用作模板;当您从JS中取消设置桥接组件的道具,并且React Native需要将本机视图的属性恢复为其默认值时,它将使用模板视图确定该默认值

作为桥接模块 网桥模块与本机视图层次结构的关系没有那么密切,它们在您创建的每个
RCTBridge
实例中初始化一次(大多数应用程序只有一个网桥)

您的API是否在本质上更具全局性,并且在应用程序期间更有效?然后,将其公开为独立于React组件层次结构的桥接模块通常是有意义的

至于
WKWebView
,最好将其添加到React原生视图层次结构之外。使用本机API修改React native拥有的部分视图层次结构是一种抽象冲突,可能会中断。因此,我建议将
WKWebView
插入React原生视图层次结构之外(例如:使用
RCTKeyWindow()
获取
UIWindow
),或者定义UI组件而不是桥接模块,并在需要时将
WKWebView
添加为空视图的子视图

在JS中使用RN的WebView
从长远来看,这应该是未来移动图书馆的最佳方法,因为纯JS具有卓越的开发工作流程和跨平台优势。但是,如果当前的WebView实现不能满足您的需要,您应该编写自己的本机UI组件或模块

我最终创建了一个桥接模块并添加了以下功能:

  @objc func showView() {
    dispatch_async(dispatch_get_main_queue(),{
      let rootVC = UIApplication.sharedApplication().delegate!.window!!.rootViewController!
      self.webView.frame = rootVC.view.frame
      rootVC.view.addSubview(self.webView)
    })

  }

  @objc func hideView() {
    dispatch_async(dispatch_get_main_queue(),{
      self.webView.removeFromSuperview()
    })

  }

因为我只是在调试情况下调用这些,所以已经足够了。我可能最终会重写它们以使用RN的WebView,但现在不需要重新发明轮子。

如果我编写UIComponent,我如何调用类的函数?让UIComponent也成为本机模块,然后从JS调用JS静态方法,并将节点句柄/反应标记(相同的东西)从JS传递到本机。