跨Storyboard跳转时revealViewController为nil的问题求助
解决SWRevealViewController侧边按钮失效问题
我来帮你捋清楚问题根源,再给你具体的解决办法:
问题出在哪?
你现在用present(_:animated:completion:)跳转到A的导航控制器,这个操作会把新的导航控制器以模态弹窗的形式独立展示,它的视图层级和原来的SWRevealViewController容器完全没关系。所以在A里调用revealViewController()时,根本找不到对应的父容器实例,自然返回nil,导致侧边按钮没法绑定菜单逻辑。
正确的跳转方式
既然整个页面架构是基于SWRevealViewController的侧滑菜单,跳转时应该用它的内置方法来切换内容视图,而不是用模态present。把B里的跳转代码改成这样:
@IBAction func jumpToA(_ sender: UIButton) { let storyboard = UIStoryboard(name: "A", bundle: nil) // 实例化A的导航控制器 guard let navA = storyboard.instantiateViewController(withIdentifier: "navA") as? UINavigationController else { return } // 获取当前的SWRevealViewController实例 guard let revealVC = self.revealViewController() else { return } // 将A的导航控制器设置为侧滑菜单的内容视图 revealVC.setFrontViewController(navA, animated: true) // 如果此时侧滑菜单是展开状态,可以手动关闭它 revealVC.revealToggle(sender) }
额外注意点
- 把A的
sideMenus()方法移到viewWillAppear(_:)里调用,而不是只在viewDidLoad()执行。因为通过setFrontViewController切换回来时,viewDidLoad不会重复触发,但viewWillAppear会,这样能保证每次显示A时都能正确绑定侧边按钮逻辑。 - 你已经把主Storyboard里的A引用ID和A.storyboard中导航控制器的ID都设为
navA,这部分配置是对的,不用改。
这样修改后,A的导航控制器就会成为SWRevealViewController的内容视图一部分,调用revealViewController()就能拿到有效实例,侧边按钮也能正常唤起菜单了。
内容的提问来源于stack exchange,提问作者Faisal Alkhotaifi
相关产品推荐
相关产品推荐

