我有一个登录视图控制器,由需要检查登录状态的各种其他视图控制器调用。他们在viewWillAppear()函数中执行此操作。登录视图控制器有一个带有closeView()函数的导航栏,可在按下时弹出它。
在这个函数中,我调用委托函数也关闭了呈现视图控制器,但是当控制器出现时,该控制器再次调用check auth函数。我关闭它的委托函数永远不会被调用。有什么办法可以实现吗?要明确的是,如果用户通过按登录控制器上的关闭按钮取消登录,我希望其呈现视图控制器也关闭。
问题似乎是checkAuth()
中viewWillAppear()
的调用在我的委托函数被调用之前触发。
这是我的代码。
class MyViewController: UIViewController, UserCancelledLoginDelegate {
var delegate : UserCancelledLoginDelegate?
-------
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
callCheckAuth() //loads login controller if not logged in
}
-------------
func shouldCloseView() {
if let navController = self.navigationController {
navController.popViewController(animated: true)
}
}
}
----------
func callCheckAuth() {
// a utility to check auth which works
if response?.statusCode == 200 {
// do stuff
}
else if response?.statusCode == 401 {
self.loadSignInView()
}
protocol UserCancelledLoginDelegate {
func shouldCloseView()
}
class LoginViewController: UIViewController {
var delegate : UserCancelledLoginDelegate?
----------
func closeView() {
delegate?.shouldCloseView()
if let navController = self.navigationController {
navController.popViewController(animated: true)
}
}
答案 0 :(得分:0)
我发现可以使用此代码关闭视图控制器及其父级,而不是使用委托。
if let navController = self.navigationController, navController.viewControllers.count > 0 {
let viewController = navController.viewControllers[navController.viewControllers.count - 3]
navigationController!.popToViewController(viewController, animated: true)
}