无法从反应本机点击推送本机视图控制器

我们正在添加对现有应用程序本机的反应,并且在将原生视图控制器推到另一个原生视图控制器之上时遇到困难,所述原生视图控制器包含反应本地视图

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

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

反应视图是一个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]; }); } 

该方法是明确的,但SNKProductViewController永远不会被推到屏幕上(没有日志消息)。 我也尝试模态地呈现视图控制器,并得到这个控制台消息:

 Warning: Attempt to present <SNKProductViewController: 0x7feadf247d10> on <SNKProductsViewController: 0x7feada5e2a20> whose view is not in the window hierarchy! 

任何帮助将不胜感激,非常感谢!

在通过RCT_EXPORT_MODULE -Native调用RCT_EXPORT_MODULEmacros之后,这个模块创build了新的实例。 并且在调用RCT_EXPORT_METHOD方法之后,此方法将从另一个模块实例中调用。 为了解决这个问题,我只find了一个解决scheme。 在调用方法从js的地方search我的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]; }); } 

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

UPD

我发现了一些解决scheme,我们可以如何获得当前的ViewController

我想你应该改变你的主视图控制器中的-viewDidLoad方法,如下所示:

 -(void)viewDidLoad{ [super viewDidLoad]; ...... RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation moduleName: @"ListingsView" launchOptions:nil]; [self.view addSubview:rootView]; } 

也就是说,不要将RCTRootView设置为“self.view”。 使其成为子视图。