如何在非TabBar项的MenuItem页面显示TabBar并返回指定Tab页(SWRevealViewController)
解决SWRevealViewController结合TabBarController的侧边菜单需求
这问题我之前处理过类似的,结合SWRevealViewController和TabBarController的场景确实容易碰到这类定制化需求,我给你拆解下具体的实现步骤,完美覆盖你的三个要求:
核心思路
我们的目标是让MenuItemViewController在**保留原有TabBar显示(且不新增标签项)**的前提下呈现,同时能快速返回TabItem1ViewController。关键在于:不要直接用SWRevealViewController的pushFrontViewController替换主视图,而是把MenuItemViewController压入TabItem1对应的导航栈中——这样既继承了TabBarController的TabBar显示,又不会修改TabBar的标签项。
1. 处理侧边菜单的MenuItem点击事件
首先在你的侧边菜单控制器(比如MenuViewController)里,给MenuItem绑定点击事件,实现如下逻辑:
Objective-C 代码
- (void)menuItemTapped { // 获取SWRevealViewController的主视图控制器(也就是你的TabBarController) UITabBarController *tabBarVC = (UITabBarController *)self.revealViewController.frontViewController; // 先切换到TabItem1(确保后续返回能回到这里) tabBarVC.selectedIndex = 0; // 获取TabItem1对应的导航控制器(注意:TabItem1必须被UINavigationController包裹) UINavigationController *navVC = (UINavigationController *)tabBarVC.selectedViewController; // 创建MenuItemViewController实例 MenuItemViewController *menuItemVC = [[MenuItemViewController alloc] initWithNibName:@"MenuItemViewController" bundle:nil]; // 压入导航栈,此时TabBar会保持显示,且TabBar标签还是原来的两个 [navVC pushViewController:menuItemVC animated:YES]; // 关闭侧边菜单 [self.revealViewController revealToggleAnimated:YES]; }
Swift 代码
@objc func menuItemTapped() { guard let tabBarVC = revealViewController()?.frontViewController as? UITabBarController else { return } // 切换到TabItem1 tabBarVC.selectedIndex = 0 guard let navVC = tabBarVC.selectedViewController as? UINavigationController else { return } let menuItemVC = MenuItemViewController(nibName: "MenuItemViewController", bundle: nil) navVC.pushViewController(menuItemVC, animated: true) // 关闭侧边菜单 revealViewController()?.revealToggle(animated: true) }
为什么这么做?
- 直接操作TabBarController的导航栈,而非替换SWReveal的主视图,所以TabBar会持续显示,且不会新增标签项(满足你的需求1和3)。
- 提前切换到TabItem1,确保后续返回时直接回到目标页面。
2. 添加返回按钮回到TabItem1ViewController
默认情况下,push后的控制器会自带返回按钮,但如果你需要自定义样式,或者强制回到TabItem1ViewController(而非栈中前一个页面),可以在MenuItemViewController的viewDidLoad中添加自定义返回按钮:
Objective-C 代码
- (void)viewDidLoad { [super viewDidLoad]; // 自定义返回按钮 UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(backToTabItem1)]; self.navigationItem.leftBarButtonItem = backButton; } - (void)backToTabItem1 { // 直接pop到导航栈根视图(也就是TabItem1ViewController) [self.navigationController popToRootViewControllerAnimated:YES]; }
Swift 代码
override func viewDidLoad() { super.viewDidLoad() // 自定义返回按钮 let backButton = UIBarButtonItem(title: "返回", style: .plain, target: self, action: #selector(backToTabItem1)) navigationItem.leftBarButtonItem = backButton } @objc func backToTabItem1() { navigationController?.popToRootViewController(animated: true) }
注意事项
- 确保你的
TabItem1ViewController是被UINavigationController包裹的,否则无法执行push/pop操作。如果之前没加,需要在TabBarController的初始化代码中给TabItem1套一层导航控制器。
内容的提问来源于stack exchange,提问作者Marjan Basiri
相关产品推荐
相关产品推荐

