应用开发中如何关闭中间控制器 实现退登直接返回主屏幕
实现方案
你可以通过「dismiss第二个页面的同时直接present第三个页面」的逻辑完成需求,具体实现分以下步骤:
步骤1:给主屏幕(第一个页面)添加Unwind Segue关联
首先在主屏幕对应的ViewController代码中添加如下方法,用于接收SignOut后的返回回调:
@IBAction func unwindToHomeScreen(_ unwindSegue: UIStoryboardSegue) { // 可在这里添加返回主屏幕后需要执行的逻辑,比如清空登录态等 }
之后在Storyboard中,按住Ctrl拖动第三个页面的「SignOut」按钮到第三个页面顶部的Exit图标,选择刚才添加的unwindToHomeScreen方法,完成unwindSegue的绑定。
步骤2:修改第二个页面(SignIn页面)的跳转逻辑
第二个页面点击「SignIn」按钮后的跳转不要直接用segue跳第三个页面,而是先dismiss自身,dismiss的完成回调中再让主屏幕present第三个页面,代码示例如下:
// 第二个页面SignIn按钮的点击方法 @IBAction func signInButtonTapped(_ sender: UIButton) { // 先拿到当前的presentingViewController,也就是主屏幕 guard let homeVC = self.presentingViewController else { return } // dismiss当前第二个页面,完成后由主屏幕present第三个页面 self.dismiss(animated: true) { // 这里用segue或者手动初始化第三个页面都可以,用segue的话: homeVC.performSegue(withIdentifier: "showThirdPageSegue", sender: nil) // 如果是手动初始化的话: // let thirdVC = ThirdViewController() // homeVC.present(thirdVC, animated: true) } }
注意:需要提前在Storyboard中给主屏幕到第三个页面的segue设置标识符为
showThirdPageSegue,不要给第二个页面到第三个页面加segue。
步骤3:验证内存释放逻辑
- 第二个页面dismiss后会自动从内存中销毁,此时内存中仅保留主屏幕和第三个页面
- 点击第三个页面的SignOut触发unwindSegue后,第三个页面会被自动销毁,内存中仅保留主屏幕,符合你的需求。
其他可选方案(基于导航控制器)
如果你的页面是嵌套在UINavigationController中,也可以直接修改导航栈的数组实现:
在跳转到第三个页面时,调用如下代码直接替换导航栈:
if let navVC = self.navigationController { let thirdVC = ThirdViewController() navVC.setViewControllers([navVC.viewControllers.first!, thirdVC], animated: true) }
SignOut时直接调用popToRootViewController(animated: true)即可回到主屏幕,同时自动销毁第三个页面。
内容的提问来源于stack exchange,提问作者Resly34
相关产品推荐
相关产品推荐

