我正在用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];
});
}