2016-01-01 40 views
1

我正在编写具有两个视图的iOS应用程序。每个视图都是由不同的React Native组件创建的RCTRootView。在一个应用程序中的两个RCTRootView实例

我看着这个问题(Multiple RCTRootView in a single App),所以现在我明白这是可能的。

但有一个问题。让第一个RCTRootView实例为B,并让第二个为B. A首先显示在屏幕上,其反应本机对象使用NativeAppEventEmitter接收来自本机应用程序的事件。在这一点上,一切正常。 A还有一个在屏幕上显示B的按钮。

当按钮被按下时,B被创建并显示。当再次按下该按钮时,B将从其超视图中移除并被销毁。

但是在此之后,NativeAppEventEmitter什么都不做。

欢迎提供任何提示或意见。

回答

1

此问题与self.bridge的症状无关。虽然我做了@synthesize bridge = _bridge,但在处理来自JavaScript方面的事件时,bridge属性为零,这是意外的。

通过检查和网上冲浪,我发现原因:对于RCTBridgeModule,对象的生命周期很难通过objective-c代码来控制。有关桥接模块的最佳做法是忘记其生命周期的所有细节,并且不要对其生命周期做出任何假设。因此,如果您自己创建了网桥模块(可能使用[MyBridge new]),则应用程序中可能会有两个不同的网桥对象。你不能确定哪个对象是从JavaScript端接收事件的人。

因此,我现在使用下面的解决方案。

@implementation EventBridge 

@synthesize bridge = _bridge; 

RCT_EXPORT_MODULE(); 

- (instancetype) init { 
    self = [super init]; 
    if (self) { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(cartUpdateNotification:) 
               name:kCartUpdateNotification 
               object:nil]; 
    } 
    return self; 
} 

+ (void) addObserver:(id)observer selector:(SEL)selector { 
    [[NSNotificationCenter defaultCenter] addObserver:observer 
              selector:selector 
               name:kMenuClickNotification 
              object:nil]; 
} 

/* 
* objc -> js call 
*/ 
+ (void) postEventWithName:(NSString *)name object:(id)object { 
    [[NSNotificationCenter defaultCenter] 
     postNotification:[NSNotification notificationWithName:name 
                object:object]]; 
} 

/* 
* js -> objc call when the hamburger is clicked 
*/ 
RCT_EXPORT_METHOD(menuClicked) 
{ 
    // This method might be called on the different TopNavViewController object. 
    [[NSNotificationCenter defaultCenter] postNotificationName:kMenuClickNotification 
                 object:nil]; 
} 

- (void) cartUpdateNotification:(NSNotification*)notification { 
    [self.bridge.eventDispatcher sendAppEventWithName:@"CartUpdated" body:@{@"item":notification.object}]; 
} 

@end 
相关问题