我是IOS开发的新手,来自Android背景。我正在寻找一种方法,一旦用户退出,返回到我的原始视图控制器。
这篇文章How can I go back to the initial view controller in Swift?建议我使用unwind segue。
但是,因为我的应用程序的用户会话可以随时(以及在任何视图控制器期间)到期。这意味着我需要从每个视图控制器到根视图控制器进行倒带segue!此外,这也会导致一些重复的代码,因为每个视图控制器都需要一种引用其自己唯一的segue ID的方法。
最初,我希望继承UIViewController
并创建一个CustomViewController
,然后我的所有其他ProfileViewController, LoginViewController
将成为子类。
CustomViewController
会提供辅助方法,例如func logOut()
。有没有办法做到这一点,也许通过一些通用的展开segue?
答案 0 :(得分:3)
你不能通用unwind segue。您无法继承ViewController的storyboard属性,包括与ViewController
关联的segue。但是你不需要通用的segue来解决你的问题。
您可以拥有BaseViewController
,所有其他视图控制器都将从BaseViewController
延伸。您可以添加逻辑来验证用户是否仍在您的BaseViewController
中登录(由于我还没有看到您的代码库,因此我无法编写代码)。
如果用户不再登录,则只需拨打
即可class BaseViewController : UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//implement your logic to monitor if user is still logged in if user not logged in simply call
self.logOut()
}
func logOut() {
//each child view controller will override and handle log out condition specifically for that ViewController
}
}
最后加载初始的ViewController,你可以简单地说在它上面弹出所有的viewController。假设您的initialViewController
是您的应用的rootViewController
,您只需在BaseViewController中修改逻辑
override func viewDidLoad() {
super.viewDidLoad()
//implement your logic to monitor if user is still logged in if user not logged in simply call
self.logOut()
UIApplication.shared.keyWindow?.rootViewController?.navigationController?.popToRootViewController(animated: true)
}
方法问题:
根据您的问题描述,我相信您的初始视图控制器保存在ViewController堆栈中,您只需在注销时放松到初始ViewController。
虽然这种方法有效,但它有三个问题
初始ViewController不必要地保留在内存中,直到用户注销后再也不会再出现,所以一旦用户登录就可以实际删除它,并在用户注销后将其恢复原状。
如果用户登录并退出应用程序并重新启动应用程序,应用程序将加载初始View控制器,但如果用户已登录,为什么您甚至会再次向他显示初始视图控制器?< / p>
因为你正在推动其他VC在最初的ViewController之上,这也意味着用户可以简单地继续按回按钮并回到初始的viewController,这是没有意义的,因为用户如何点击后退按钮有与用户登录状态有什么关系?不是吗?
那么更好的解决方案呢?
在应用启动时更改应用的根视图控制器。
打开你的AppDelegate和
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
//check if user is logged in
guard let window = UIApplication.shared.keyWindow else {
return
}
if (userIsLoggedIn) {
//load view controller that you wanna show after login lets say Home
let homeVC = //instantiate view controller from story board
UIView.transition(with: window, duration: 0.3, options: .transitionCrossDissolve, animations: {
window.rootViewController = homeVC
}, completion: { completed in
// maybe do something here
})
}
else {
//load initial controller
let initialVC = //instantiate view controller from story board
UIView.transition(with: window, duration: 0.3, options: .transitionCrossDissolve, animations: {
window.rootViewController = initialVC
}, completion: { completed in
// maybe do something here
})
}
}
最后,如果用户没有登录并且您最终加载初始VC并且一旦用户登录您的初始VC,您可以使用我上面编写的代码来更改根VC
let initialVC = //instantiate view controller from story board
UIView.transition(with: window, duration: 0.3, options: .transitionCrossDissolve, animations: {
window.rootViewController = initialVC
}, completion: { completed in
// maybe do something here
})
答案 1 :(得分:1)
如果要返回登录视图控制器,可以从下一个视图设置单个倒带(退出)到该视图。然后使用通知中心在应用中的任何位置发布通知。 “登录旁边”视图会观察通知并执行倒带segue。