col*_*fet 8 javascript ios react-native
在我的React本机应用程序中,我正在尝试将本地代码中的事件发送到AppDelegate中的JavaScript.为此,我打电话给:
[self.bridge.eventDispatcher sendAppEventWithName:@"EventReminder"
body:@{@"name": eventName}];
Run Code Online (Sandbox Code Playgroud)
在我的应用代表中.当然要做到这一点我需要导入:
并合成桥梁
@synthesize bridge = _bridge;
Run Code Online (Sandbox Code Playgroud)
但是在此之后的事件中,桥变量不存在.为了使这个错误消失,我使我的AppDelegate符合RCTBridgeModule协议,如下所示:
AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeModule>
Run Code Online (Sandbox Code Playgroud)
然后在我的AppDelegate.m中,我做了:
RCT_EXPORT_MODULE()
Run Code Online (Sandbox Code Playgroud)
毕竟我的桥终于没有错误,但每次我在AppDelegate中使用它,它都是零.
我哪里错了?
提前致谢.
Nic*_*ood 14
RCTBridge在启动时创建每个模块类的新实例,因此当您将AppDelegate导出为桥接模块时,您告诉桥接器创建新的AppDelegate,并为其提供桥接实例.
iOS还会在应用程序启动时创建AppDelegate实例,但iOS创建的实例与RCTBridge创建的实例不同.
所以基本上,你有两个AppDelegate实例:你试图访问self.bridge的那个实例,它不是由RCTBridge创建的,所以没有对它的引用,而是由RCTBridge创建的实例,它有一个桥,但不是您的UIApplication的委托,并且没有运行您的代码.
你有几个选择:
1)当您使用RCTBridgeDelegate的extraModules方法创建AppDelegate实例时,可以将其传递到桥中.这允许您告诉桥使用模块的现有实例,而不是创建新模块.
2)您可以通过RCTRootView访问网桥,而不是将AppDelegate变为模块,以便为其提供self.bridge属性.
3)将需要与桥接通信的逻辑从AppDelegate移出到新模块中.如果需要由AppDelegate中的事件触发,请使用NSNotifications与模块实例进行通信(我们将此模式用于RCTPushNotificationManager).
在这些选项中,
选项1)可能是最复杂的正确做法.
选项2)可能是最容易做到的,因为你可能已经在AppDelegate中有一个RCTRootView实例,你可以参考.
选项3)从技术角度来看是理想的,因为它可以防止您在桥接器正确初始化之前意外发送事件(可能会崩溃或出现意外行为).
| 归档时间: |
|
| 查看次数: |
3753 次 |
| 最近记录: |