UINavigationController自定义返回按钮移至底部工具栏 如何获取导航标题生成长按菜单

你可以通过遍历UINavigationController的viewControllers导航栈属性获取所有层级的标题,再绑定到按钮的长按菜单中,具体实现如下:
实现步骤
1. 提取导航栈标题数组
Swift 示例
func getNavigationStackTitles() -> [String] { guard let navVC = navigationController else { return [] } // 如需排除当前顶层页面的标题,加上 .dropLast() 即可 return navVC.viewControllers.compactMap { $0.title } }
Objective-C 示例
- (NSArray<NSString *> *)getNavigationStackTitles { if (!self.navigationController) return @[]; NSMutableArray *titles = [NSMutableArray array]; for (UIViewController *vc in self.navigationController.viewControllers) { if (vc.title.length > 0) [titles addObject:vc.title]; } // 如需排除当前顶层页面的标题,打开下方注释 // if (titles.count > 0) [titles removeLastObject]; return titles.copy; }
2. 给底部返回按钮绑定长按菜单
iOS 14及以上系统可以直接使用系统自带的UIMenu能力,无需手动添加手势,系统会自动处理「单击返回上一级、长按弹出菜单」的交互:
Swift 示例
// 你已添加到工具栏的返回按钮实例 let bottomBackButton = UIBarButtonItem( image: UIImage(systemName: "chevron.left"), style: .plain, target: self, action: nil ) func setupBackButtonMenu() { let stackTitles = getNavigationStackTitles() var menuItems: [UIAction] = [] // 遍历标题生成菜单项,点击后跳转到对应层级 for (index, title) in stackTitles.enumerated() { let action = UIAction(title: title) { [weak self] _ in guard let navVC = self?.navigationController else { return } let targetVC = navVC.viewControllers[index] navVC.popToViewController(targetVC, animated: true) } menuItems.append(action) } // 绑定菜单到按钮 bottomBackButton.menu = UIMenu(children: menuItems) // 配置单击响应:返回上一级 bottomBackButton.primaryAction = UIAction(title: "") { [weak self] _ in self?.navigationController?.popViewController(animated: true) } }
兼容低版本iOS说明
如果需要支持iOS 14以下系统,你可以给按钮添加UILongPressGestureRecognizer长按手势,触发后弹出UIAlertController或者自定义下拉菜单实现相同效果。
提示:如果部分页面没有设置
title属性,你可以给UIViewController扩展一个自定义的导航展示名字段,遍历导航栈时取该字段即可。
内容的提问来源于stack exchange,提问作者unknown
相关产品推荐
相关产品推荐

