无法从本机视图控制器推送本机视图控制器

gog*_*ogi 5 ios react-native

我们正在为现有应用添加本机响应,并且在将本机视图控制器置于另一个本机视图控制器之上时遇到问题,该控制器包含反应本机视图.

主视图控制器的viewDidLoad如下所示:

-(void)viewDidLoad {
    ...
    RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation moduleName: @"ListingsView" launchOptions:nil];
    self.view = rootView;
}
Run Code Online (Sandbox Code Playgroud)

react视图是一个ListView,其中TouchableHighlight的onPress在同一视图控制器上导出到此方法:

RCT_EXPORT_METHOD(productClicked:(NSDictionary *)productDict)
{
    dispatch_async(dispatch_get_main_queue(),
        ^{
            SNKProduct *product = [[SNKProduct alloc] initWithDictionary:productDict];
            SNKProductViewController *vc = [[SNKProductViewController alloc] initWithProduct:product];
            [self.navigationController pushViewController:vc animated:YES];
        });

}
Run Code Online (Sandbox Code Playgroud)

该方法肯定被调用,但SNKProductViewController永远不会被推到屏幕上(没有日志消息).我也试过模态呈现视图控制器,并收到此控制台消息:

Warning: Attempt to present <SNKProductViewController: 0x7feadf247d10> on <SNKProductsViewController: 0x7feada5e2a20> whose view is not in the window hierarchy!
Run Code Online (Sandbox Code Playgroud)

感谢任何帮助,非常感谢!

Bim*_*awa 3

通过 Reac-Native调用RCT_EXPORT_MODULE宏后,创建了该模块的新实例。在调用方法之后,RCT_EXPORT_METHOD该方法从模块的另一个实例调用。为了解决这个问题,我目前只找到了一个解决方案。在 js 调用的方法中,在层次结构控制器中搜索我的 ViewController:

RCT_EXPORT_MODULE(AuthController);

- (instancetype)init {
    self = [super init];
    if (self) {
    }

    return self;
}

- (void)loadView {
    self.view = [[RCTRootView alloc] initWithBundleURL:[[BCEConfigs sharedInstance] getBundleOfReactResources]
                                            moduleName:@"AuthorizationView"
                                         launchOptions:nil];
}

- (void)viewDidLoad {
    [super viewDidLoad];
}

RCT_EXPORT_METHOD(a_registrationButton) {
    [self presentRegistrationViewController];
}

- (void)presentRegistrationViewController {
    UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
    UIViewController *mainViewController = keyWindow.rootViewController.childViewControllers[0];
    BCERegistrationViewController *bceRegistrationViewController = [BCERegistrationViewController new];
    dispatch_async(dispatch_get_main_queue(), ^{
        [mainViewController presentViewController:bceRegistrationViewController animated:YES completion:nil];
    });
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我需要的控制器有一个地方window>rootViewController>authViewController

UPD

我找到了一些解决方案,如何获取当前的 ViewController