无法关闭2视图控制器

时间:2018-10-13 08:40:23

标签: ios iphone swift xcode swift4

我有3个ViewController:LoginViewController,CheckinViewController和ProfileViewController

流为: LoginVC-> CheckinVC-> ProfileVC

我需要的是: 当我单击“ ProfileVC”中的注销按钮,然后回到“ LoginVC”时,我想关闭“ ProfileVC”和“ CheckinVC”

LoginVC.swift

let checkinViewController = self.storyboard?.instantiateViewController(withIdentifier: "CheckinViewController") as! CheckinViewController                    
self.navigationController?.pushViewController(checkinViewController, animated: true)
JustHUD.shared.hide()
self.dismiss(animated: false, completion: nil)

CheckinVC.swift

if let profileView = self.storyboard?.instantiateViewController(withIdentifier: "ProfileViewController") {
        profileView.providesPresentationContextTransitionStyle = true
        profileView.definesPresentationContext = true
        profileView.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext;
        //            profileView.view.backgroundColor = UIColor.init(white: 0.4, alpha: 0.8)
        profileView.view.backgroundColor = UIColor.clear
        profileView.view.isOpaque = false
        self.present(profileView, animated: true, completion: nil)

这是我想做的事

ProfileVC.swift

@IBAction func clickLogout(_ sender: Any) {
    UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
    UserDefaults.standard.synchronize()

    self.dismiss(animated: false, completion: {
        print("ProfileView : dismiss completed")

        let loginViewController = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
        self.navigationController?.pushViewController(loginViewController, animated: true)

        self.dismiss(animated: false, completion: {
            print("SUCCESS")
        })

    })
}

ProblemDismiss

4 个答案:

答案 0 :(得分:3)

好吧,您需要执行Unwind Segue,以便可以返回到LoginVC。 请按照以下四个简单步骤来创建Unwind segues

  1. 在视图控制器中,您尝试返回到示例中的LoginVC,编写以下代码:

    @IBAction func unwindToVC1(segue:UIStoryboardSegue) { }
    
  

(请记住:在视图中插入此方法很重要   控制器,您正尝试返回至! )

  1. Storyboard中,转到您要从中展开的屏幕(在本例中为ProfileVC),然后按住+将viewController图标拖到顶部的退出图标。

exit  3.转到viewController中所选Storyboard的文档大纲,如下所示选择the unwind segue

storyboard

现在,转到Attributes Inspector中的Utilities Pane并命名展开序列的标识符。

identity inspector

  1. 最后,将此代码编写在您希望触发放松搜索动作的位置,在本例中为ProfileVC

     @IBAction func clickLogout(_ sender: Any) {
            UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
              UserDefaults.standard.synchronize()
                performSegue(withIdentifier: "unwindSegueToVC1", sender: self)
     }
    

有关更多信息,请检查Create Unwind Segues

答案 1 :(得分:1)

如果您想使用情节提要,虽然Enea Dume的解决方案是正确的,但这里是问题的说明,并且如果您要像到目前为止一样在代码中进行操作,则可以使用解决方案。

问题

如果我们专注于ProfileVC中logoutFunction中的self.dismiss调用,则会发生这种情况。

第一次调用self.dismiss时,ProfileVC将自行关闭并从视图堆栈中删除。

在完成委托中,您要将新的LoginVC推送到导航控制器。但是,CheckIN VC是通过导航控制器提供的,因此您什么也看不到。

对self.dismiss的第二次调用无济于事,因为ProfileVC不提供任何其他视图控制器,并且不再存在于堆栈中。

解决方案

您需要保留对提供CheckInVC的LoginVC的引用。如果调用“对LoginVC的引用”。dismiss,它将关闭堆栈中位于其上方的视图控制器,并将您带回到登录视图控制器。

答案 2 :(得分:0)

在CheckinVC.swift类的viewDidAppear函数中,根据您要维护的会话并相应地弹出登录视图控制器,检查用户是否仍处于活动状态。如果用户状态已注销,则它将转到登录视图控制器。否则它将照常工作。

答案 3 :(得分:0)

问题是您试图关闭两次ProfileVC,但实际上需要关闭它,然后弹出CheckinVC。

在关闭视图控制器之后,它不再具有对NavigationController的引用,因此您需要在时间变量中对其进行引用。

像这样更改ProfileVC:

@IBAction func clickLogout(_ sender: Any) {
    UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
    UserDefaults.standard.synchronize()

    let navigationController = self.navigationController
    let loginViewController = storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
    self.dismiss(animated: false, completion: {
        print("ProfileView : dismiss completed")
        navigationController?.pushViewController(loginViewController, animated: true)
        navigationController?.popViewController(animated: false)
    })
}