Swift4.0中如何通过SWRevealViewController从sw_front控制器返回主控制器?
解决SWRevealViewController从sw_front控制器返回主控制器的问题
咱们先理清楚SWRevealViewController的核心逻辑:它的frontViewController是当前显示的主内容区控制器,侧边栏对应rearViewController。你现在遇到的问题是切换到新的sw_front控制器后,没法回到最初的主控制器,我给你几个针对性的解决方案,你可以根据自己的实现情况选择:
方案1:给sw_front控制器添加返回按钮,直接切换回初始主控制器
在你的sw_front控制器的viewDidLoad方法里,添加返回按钮(导航栏按钮或自定义按钮),触发切换逻辑:
override func viewDidLoad() { super.viewDidLoad() // 给导航栏添加返回按钮(如果有导航栏的话) let backButton = UIBarButtonItem(title: "返回主页面", style: .plain, target: self, action: #selector(backToMainViewController)) navigationItem.leftBarButtonItem = backButton // 如果没有导航栏,也可以用自定义按钮添加到视图上 // let backBtn = UIButton(frame: CGRect(x: 20, y: 40, width: 80, height: 30)) // backBtn.setTitle("返回主页", for: .normal) // backBtn.addTarget(self, action: #selector(backToMainViewController), for: .touchUpInside) // view.addSubview(backBtn) } @objc func backToMainViewController() { // 从Storyboard获取初始主控制器,记得先给主控制器设置好Storyboard ID guard let mainVC = storyboard?.instantiateViewController(withIdentifier: "MainViewControllerID") as? MainViewController else { return } // 获取SWRevealViewController实例,替换当前的frontViewController if let revealVC = revealViewController() { revealVC.setFrontViewController(mainVC, animated: true) } }
注意:要提前在Storyboard里给你的初始主控制器设置Storyboard ID(比如示例里的"MainViewControllerID"),否则无法正确实例化。
方案2:通过侧边栏菜单切换回主控制器
如果你的侧边栏菜单里本来就有“返回主页面”的选项,只需要在菜单的点击事件里执行替换frontViewController的逻辑即可:
@objc func menuItemTapped(_ sender: UIButton) { guard let itemTitle = sender.titleLabel?.text else { return } var targetVC: UIViewController? if itemTitle == "主页面" { targetVC = storyboard?.instantiateViewController(withIdentifier: "MainViewControllerID") } else if itemTitle == "其他功能页" { targetVC = storyboard?.instantiateViewController(withIdentifier: "OtherViewControllerID") } if let vc = targetVC, let revealVC = revealViewController() { revealVC.setFrontViewController(vc, animated: true) // 切换完成后自动关闭侧边栏 revealVC.revealToggle(animated: true) } }
方案3:用导航控制器包裹初始主控制器,通过栈返回
如果你的初始主控制器是被导航控制器包裹的,且sw_front控制器是push到导航栈中的,可以直接用popToRootViewController返回:
首先在初始设置SWRevealViewController时,把主控制器放在导航控制器里:
let mainVC = storyboard?.instantiateViewController(withIdentifier: "MainViewControllerID") as! MainViewController let mainNavVC = UINavigationController(rootViewController: mainVC) let menuVC = storyboard?.instantiateViewController(withIdentifier: "MenuViewControllerID") as! MenuViewController let revealVC = SWRevealViewController(rearViewController: menuVC, frontViewController: mainNavVC) // 设置为根控制器 window?.rootViewController = revealVC
然后在sw_front控制器里添加返回方法:
@objc func backToMain() { navigationController?.popToRootViewController(animated: true) }
额外注意事项
- 确保
revealViewController()能正确获取到SWRevealViewController实例,只要你的sw_front控制器是作为它的frontViewController(或嵌套在其中),这个方法就能正常返回。 - 如果你用了SWRevealViewController的子类,要确认子类没有重写
setFrontViewController等核心方法,导致逻辑异常。
内容的提问来源于stack exchange,提问作者Tolibov Umid
相关产品推荐
相关产品推荐

