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

时间:2015-04-13 03:54:55

标签: ios react-native

我们正在为现有应用添加本机响应,并且无法在另一个包含反应原生视图的本机视图控制器之上推送本机视图控制器。

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

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

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];
        });

}

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

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

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

通过Reac-Native调用RCT_EXPORT_MODULE宏后,这将创建此模块的新实例。在调用RCT_EXPORT_METHOD方法之后,此方法从另一个模块实例调用。为了解决这个问题,我发现只有一个解决方案。在js中调用我的ViewController在Hierarchy控制器中调用方法的地方:

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

this i found我们如何获得当前的ViewController

的一些解决方案

答案 1 :(得分:-1)

我认为您应该在主视图控制器中更改-viewDidLoad方法,如下所示:

mouseenter

也就是说,不要将RCTRootView设置为'self.view';把它作为一个子视图。