React Native Hybrid应用程序:嵌入RCTRootView的Pop UIViewController



我正在用Objective-C/Swift编写的现有iOS应用程序中集成组件。

作为应用程序的根视图控制器,我使用UINavigationController

在我的应用程序的一个多视图控制器中,我有一个按钮,可以按下导航控制器中的视图控制器,该控制器包含以下代码:

@objc class ReactNativeViewController: UIViewController {
  override func viewDidLoad() {
    let jsCodeLocation = NSURL(string: "http://localhost:8081/index.ios.bundle?platform=ios&dev=true")
    let contactsView = RCTRootView(bundleURL: jsCodeLocation, moduleName: "MainComponent", initialProperties: nil, launchOptions: nil)
    self.view.addSubview(contactsView)
    contactsView.frame = self.view.bounds;
  }
}

MainComponent返回一个管理多个React Native组件的Navigator

return (
  <Navigator
    initialRoute={initialRoute}
    renderScene={(route, navigator) => {
      if (route.component) {
        return <route.component navigator={navigator} {...route.passProps} />;
      }
    }}
    navigationBar={
      <Navigator.NavigationBar
        routeMapper={this.NavigationBarRouteMapper}
        style={styles.navBar}
      />
    }
  />
);

该工作流程运行良好。我只需要一种方法,当主React Native组件上的按钮Back被按下时,从我的UINavigationController中弹出ReactNativeViewController

我尝试了以下操作,但没有成功:

  • 使用单个方法popLastViewController创建本机模块,该方法弹出从UINavigationController:显示的UIViewController

    @implementation RNNavigationControllerBridge
    RCT_EXPORT_MODULE()
    RCT_EXPORT_METHOD(popLastViewController) {
      UINavigationController *navigationController = (UINavigationController *)[[[[UIApplication sharedApplication] delegate] window] rootViewController];
      [navigationController popViewControllerAnimated:NO];
    }
    @end
    
  • 当按下后退按钮时调用上述方法:

    onPress={() => {
      if (index === 0) {
        NativeViewsManager.popLastViewController();
      } else {
        navigator.pop();
      }
    }}
    

但这行不通。

有什么建议吗?

问题解决了!

RCT_EXPORT_METHOD(popLastViewController) {
  dispatch_async(dispatch_get_main_queue(), ^{
    UINavigationController *navigationController = (UINavigationController *)[[[[UIApplication sharedApplication] delegate] window] rootViewController];
    [navigationController popViewControllerAnimated:YES];
  });
}

最新更新