我有3个ViewController:LoginViewController,CheckinViewController和ProfileViewController
流为: LoginVC-> CheckinVC-> ProfileVC
我需要的是: 当我单击“ ProfileVC”中的注销按钮,然后回到“ LoginVC”时,我想关闭“ ProfileVC”和“ CheckinVC”
let checkinViewController = self.storyboard?.instantiateViewController(withIdentifier: "CheckinViewController") as! CheckinViewController
self.navigationController?.pushViewController(checkinViewController, animated: true)
JustHUD.shared.hide()
self.dismiss(animated: false, completion: nil)
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)
这是我想做的事
@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")
})
})
}
答案 0 :(得分:3)
好吧,您需要执行Unwind Segue
,以便可以返回到LoginVC
。
请按照以下四个简单步骤来创建Unwind segues
:
在视图控制器中,您尝试返回到示例中的LoginVC
,编写以下代码:
@IBAction func unwindToVC1(segue:UIStoryboardSegue) { }
(请记住:在视图中插入此方法很重要 控制器,您正尝试返回至! )
Storyboard
中,转到您要从中展开的屏幕(在本例中为ProfileVC),然后按住+将viewController
图标拖到顶部的退出图标。
3.转到viewController
中所选Storyboard
的文档大纲,如下所示选择the unwind segue
。
现在,转到Attributes Inspector
中的Utilities Pane
并命名展开序列的标识符。
最后,将此代码编写在您希望触发放松搜索动作的位置,在本例中为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)
})
}