1

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

编辑 2015 年 3 月 31 日:

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

4

4 回答 4

1

React 视图不可能在不通过 JavaScript 的情况下直接调用本机方法,除非您为屏幕上的所有内容创建自定义本机视图插件。

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

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

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

于 2015-03-28T14:40:46.473 回答
1

我有同样的问题,我做了什么来解决它:

  1. 围绕 NSNotificationCenter 创建 Native Module 包装器,以便 javascript 代码可以发布 iOS 事件。

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

  3. 当用户单击按钮时引发事件(当我们需要将控制权交还给 Objective-c 时),需要的数据作为字典传递。

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

在现有 iOS 应用程序中仅对某些视图使用 React Native

于 2015-06-11T07:34:14.243 回答
0

看看文档:

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

React Native 提供“原生模块”作为 Obj-C 和 JavaScript 之间的桥梁。在 React Native 主页上还有更多关于此的内容:

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

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

于 2015-03-28T12:02:13.697 回答
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!

   }
于 2017-11-29T10:15:55.763 回答