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配置错误:
- 先确认Storyboard中
FavouriteStationsTableViewController的Storyboard ID确实为favourites,大小写完全匹配 - 调整主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
相关产品推荐
相关产品推荐

