You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 23:57:01