我现有的Obj-C项目具有丰富的业务逻辑。我想在特定的屏幕上尝试使用React Native(我的意思是在Cocoa方面使用View Controller),但我在repo中看到的每个例子都包含javascript中的逻辑。如何将React Native视为渲染,但将用户操作传递给Objective-C代码?
编辑2015年3月31日:
本机视图模块似乎不是一个好的解决方案,因为本机模块可以从React代码实现。因此,如果我想为该视图控制器使用已经创建的视图模型,我需要一些单例,这就像侧面的一些共享状态。我认为这很糟糕。
答案 0 :(得分:1)
除非您为屏幕上的所有内容创建自定义本机视图插件,否则React视图无法直接调用本机方法是不可能的。
您最好的选择可能是创建一个自定义本机模块,导出您要调用的所有本机方法,然后编写一个最小的React JavaScript应用程序,除了通过调用这些方法从视图向模块转发触摸事件之外什么都不做。
如果需要与JS应用程序进行通信,则模块可以使用传递给导出方法的回调,也可以使用JS代码可以观察的广播事件。
为了充分利用React Native,我建议您尝试将所有视图和控制器逻辑保留在JS部分中,并且只从本机端公开业务逻辑。否则,您将失去快速重新加载以测试更改等所有好处。
答案 1 :(得分:1)
我遇到了同样的问题以及我采取了哪些措施来解决问题:
围绕NSNotificationCenter创建本机模块包装,因此javascript代码可以发布iOS事件。
在ReactController-wrapper中围绕React-Native代码订阅该事件。
当用户点击按钮时(当我们需要将控制权交还给objective-c时)提升事件,并将所需数据作为字典传递。
从ReactController-wrapper(objective-c)捕获事件,处理数据,打开其他控制器/等。
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! }