使用SWRevealViewController时Segue报错:需设置performHandler或重写-perform
解决SWRevealViewController侧边菜单performSegue报错的问题
这个报错的核心原因是:SWRevealViewController的侧边菜单(也就是你的MenuViewController)并不是常规导航栈里的控制器,直接调用performSegue的话,系统找不到正确的执行逻辑——毕竟侧边菜单的设计初衷是触发主内容区的页面切换,而非自己作为跳转发起方。
给你两种实用的解决办法:
方法一:通过主内容控制器切换页面(推荐)
这是最贴合SWRevealViewController设计逻辑的方式,直接修改主内容区的控制器即可:
switch indexPath.row { case 0: // 先获取SWRevealViewController实例 guard let revealVC = self.revealViewController() else { break } // 从Storyboard实例化目标控制器(记得给目标VC在Storyboard里设置好ID,比如"MyViewController") let targetVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MyViewController") // 根据主内容区的类型处理页面切换 if let navVC = revealVC.frontViewController as? UINavigationController { // 替换导航栈根控制器(如果需要保留历史栈,可改用pushViewController) navVC.setViewControllers([targetVC], animated: true) } else { // 直接设置为主内容控制器 revealVC.setFrontViewController(targetVC, animated: true) } // 自动关闭侧边菜单 revealVC.revealToggle(animated: true) case 1: // 同理处理第二个页面的切换逻辑 guard let revealVC = self.revealViewController() else { break } let otherVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "OtherViewController") if let navVC = revealVC.frontViewController as? UINavigationController { navVC.setViewControllers([otherVC], animated: true) } else { revealVC.setFrontViewController(otherVC, animated: true) } revealVC.revealToggle(animated: true) default: break }
方法二:给Segue设置performHandler(若坚持用Segue)
如果你一定要保留Storyboard里的Segue,可以在MenuViewController的viewDidLoad中手动给Segue指定执行逻辑:
override func viewDidLoad() { super.viewDidLoad() // 给"MySegue"设置执行逻辑 if let mySegue = self.segue(withIdentifier: "MySegue", sender: self) { mySegue.performHandler = { [weak self] segue in guard let self = self, let revealVC = self.revealViewController() else { return } let targetVC = segue.destination // 处理主内容区页面切换 if let navVC = revealVC.frontViewController as? UINavigationController { navVC.pushViewController(targetVC, animated: true) } else { revealVC.setFrontViewController(targetVC, animated: true) } // 关闭侧边菜单 revealVC.revealToggle(animated: true) } } // 同理给"OtherSegue"设置执行逻辑 if let otherSegue = self.segue(withIdentifier: "OtherSegue", sender: self) { otherSegue.performHandler = { [weak self] segue in guard let self = self, let revealVC = self.revealViewController() else { return } let targetVC = segue.destination if let navVC = revealVC.frontViewController as? UINavigationController { navVC.pushViewController(targetVC, animated: true) } else { revealVC.setFrontViewController(targetVC, animated: true) } revealVC.revealToggle(animated: true) } } }
两种方法都能解决报错问题,更推荐第一种,逻辑更清晰也更符合SWRevealViewController的使用场景。
内容的提问来源于stack exchange,提问作者Marjan Basiri
相关产品推荐
相关产品推荐

