我的反应js代码如何与现有的Obj-C逻辑交互?

时间:2015-03-28 11:51:21

标签: react-native

我现有的Obj-C项目具有丰富的业务逻辑。我想在特定的屏幕上尝试使用React Native(我的意思是在Cocoa方面使用View Controller),但我在repo中看到的每个例子都包含javascript中的逻辑。如何将React Native视为渲染,但将用户操作传递给Objective-C代码?

编辑2015年3月31日:

本机视图模块似乎不是一个好的解决方案,因为本机模块可以从React代码实现。因此,如果我想为该视图控制器使用已经创建的视图模型,我需要一些单例,这就像侧面的一些共享状态。我认为这很糟糕。

4 个答案:

答案 0 :(得分:1)

除非您为屏幕上的所有内容创建自定义本机视图插件,否则React视图无法直接调用本机方法是不可能的。

您最好的选择可能是创建一个自定义本机模块,导出您要调用的所有本机方法,然后编写一个最小的React JavaScript应用程序,除了通过调用这些方法从视图向模块转发触摸事件之外什么都不做。

如果需要与JS应用程序进行通信,则模块可以使用传递给导出方法的回调,也可以使用JS代码可以观察的广播事件。

为了充分利用React Native,我建议您尝试将所有视图和控制器逻辑保留在JS部分中,并且只从本机端公开业务逻辑。否则,您将失去快速重新加载以测试更改等所有好处。

答案 1 :(得分:1)

我遇到了同样的问题以及我采取了哪些措施来解决问题:

  1. 围绕NSNotificationCenter创建本机模块包装,因此javascript代码可以发布iOS事件。

  2. 在ReactController-wrapper中围绕React-Native代码订阅该事件。

  3. 当用户点击按钮时(当我们需要将控制权交还给objective-c时)提升事件,并将所需数据作为字典传递。

  4. 从ReactController-wrapper(objective-c)捕获事件,处理数据,打开其他控制器/等。

  5. Using React Native within existing iOS app for some views only

答案 2 :(得分:0)

查看文档:

http://facebook.github.io/react-native/docs/nativemodulesios.html#content

React Native提供“Native Modules”作为Obj-C和JavaScript之间的桥接方式。在React Native主页上还有更多关于此内容:

http://facebook.github.io/react-native/

在“扩展性”标题下,它显示了如何公开自定义iOS视图。

答案 3 :(得分:0)

如果您在视图控制器中实现RCTRootView,则可以使用它来访问RTCBridge,然后从此获取对模块的访问权。

这将允许您在模块中保留视图控制器的引用,使您能够直接将调用传递给方法,而不是依赖于NSNotifications。

示例:

在视图控制器中

    let reactView = RCTRootView(bundleURL: jsCodeLocation, moduleName: "MyReactApp", initialProperties: nil, launchOptions: nil)
    self.reactBridge = reactView.bridge
    let myModule = self.reactBridge.module(for: MYModuleClass.self) as! MYModuleClass
    myModule.viewController = self

在你的模块中保留参考:

   @objc(MYModuleClass)
   class MYModuleClass: NSObject {

      weak var viewController: MyViewController!

   }