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

Swift中侧边滑动菜单点击后无法跳转至其他ViewController如何解决

问题原因排查与修复

第一步:先确认回调链路是否正常

运行项目点击对应菜单项,查看控制台输出:

  • 如果同时打印了菜单内的Dismissing: favourites和主VC内的favourites,说明回调链路正常,问题出在跳转逻辑
  • 如果没有以上打印,说明回调被中断

常见问题与对应修复方案

方案1:修复回调触发时机(最常见原因)

你当前把回调放在了菜单dismiss的完成闭包中,且用了[weak self]修饰菜单VC,dismiss过程中菜单VC可能提前被释放导致回调无法触发,调整MenuTableViewController的didSelectRowAt逻辑:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    guard let menuType = MenuType(rawValue: indexPath.row) else {
        return
    }
    // 先触发回调再执行dismiss,避免菜单VC被释放导致回调失效
    didTapMenuType?(menuType)
    dismiss(animated: true)
}

方案2:确认枚举与单元格顺序匹配

你的MenuType枚举顺序是:

  • 0: home
  • 1: favourites
  • 2: nightMode
    要确认你点击的菜单单元格是列表的第2个(indexPath.row=1),如果点击的是第1个home单元格,会走default分支,自然没有跳转效果。

方案3:修复跳转逻辑

如果回调正常但页面没有弹出,一般是当前主VC不是顶层可跳转的控制器,或Storyboard ID配置错误:

  1. 先确认Storyboard中FavouriteStationsTableViewController的Storyboard ID确实为favourites,大小写完全匹配
  2. 调整主VC的跳转逻辑,获取顶层控制器执行present:
func transitionToNew(_ menuType: MenuType){
    switch menuType {
    case .favourites:
        guard let VC = storyboard?.instantiateViewController(identifier: "favourites") as? FavouriteStationsTableViewController else {
            print("收藏页实例化失败,请检查Storyboard ID配置")
            return
        }
        // 获取当前顶层控制器执行跳转
        let keyWindow = UIApplication.shared.connectedScenes
            .filter({$0.activationState == .foregroundActive})
            .compactMap({$0 as? UIWindowScene})
            .first?.windows
            .filter({$0.isKeyWindow}).first
        keyWindow?.rootViewController?.topMostViewController()?.present(VC, animated: true)
    case .nightMode:
        let keyWindow = UIApplication.shared.connectedScenes
            .filter({$0.activationState == .foregroundActive})
            .compactMap({$0 as? UIWindowScene})
            .first?.windows
            .filter({$0.isKeyWindow}).first
        keyWindow?.overrideUserInterfaceStyle = .dark
    default:
        break
    }
}

配套添加获取顶层控制器的扩展:

extension UIViewController {
    func topMostViewController() -> UIViewController {
        if let presented = self.presentedViewController {
            return presented.topMostViewController()
        }
        if let nav = self as? UINavigationController {
            return nav.visibleViewController?.topMostViewController() ?? nav
        }
        if let tab = self as? UITabBarController {
            return tab.selectedViewController?.topMostViewController() ?? tab
        }
        return self
    }
}

内容的提问来源于stack exchange,提问作者BetYx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:36:03