如何从当前视图控制器弹出先前的视图控制器?

时间:2019-02-09 16:03:06

标签: ios swift

我有一个仪表板,然后有一个登录屏幕和个人资料屏幕。进入个人资料屏幕后,我希望删除登录屏幕,以便当我按“后退”按钮时,将被带到仪表板而不是登录名。这些都是导航视图控制器的视图控制器,我使用当前方法显示tge。

我有一个问题,在使用导航过程中,登录可以出现在任何地方。示例:仪表板,屏幕2,屏幕3,登录名,配置文件。在这里,我必须删除登录名,并且当用户从个人资料中点击时,它应该显示屏幕3。

3 个答案:

答案 0 :(得分:0)

如果您已经登录并且必须移至top viewController,则可以执行 window.rootViewController.dismiss(animated: true, completion: nil)

但是,如果您使用的是NavigationController,那么它将起作用: navigationController.popToRootViewController(animated: true)

答案 1 :(得分:0)

在登录视图控制器中执行以下操作:

override func viewWillDisappear(_ animated: Bool) {
    var navigationArray = navigationController?.viewControllers
    let count = navigationArray?.count
    navigationArray?.remove(at: count! - 2)
    navigationController?.viewControllers = navigationArray!
}

这将在即将消失时从导航堆栈中删除当前的视图控制器(在您的情况下为登录VC)。因此,当您从下一个VC点击后退按钮时,它将始终带您进入登录前的VC。

答案 2 :(得分:0)

这是通用答案,不仅用于此问题的答案。

弹出时,您可以从导航控制器中踢出viewControllers,可以解决您的问题

extension UINavigationController { 
     public func removeViewController(classes : [String]) {
           var vcs = [UIViewControllers]()
           for viewController in self.viewControllers {
               let name = viewController.className
               if !classes.contains(name) {
                    vcs.append(viewController)
                }
           }
           if classes.count < vcs.count {
               self.viewControllers = vcs
           }
    }
}

现在认为您有3个viewControllers,仪表板,登录名,配置文件。您要删除登录名并从个人资料移回仪表板

在个人资料的视图控制器中

override func viewDidLoad() {
   super.viewDidLoad()
   //your works
   let viewControllersToRemove = [String(describing: type(of:login))]
   navigationController.removeViewController(classes : viewControllersToRemove)
}