从未调用Swift3协议委托函数

时间:2017-04-21 13:42:56

标签: swift3 swift-protocols

我有一个登录视图控制器,由需要检查登录状态的各种其他视图控制器调用。他们在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)
        }
}

1 个答案:

答案 0 :(得分:0)

我发现可以使用此代码关闭视图控制器及其父级,而不是使用委托。

    if let navController = self.navigationController, navController.viewControllers.count > 0 {

        let viewController = navController.viewControllers[navController.viewControllers.count - 3]

        navigationController!.popToViewController(viewController, animated: true)

    }