2017-04-21 59 views
0

我有一个登录视图控制器,由各种其他视图控制器调用,需要检查登录状态。他们在viewWillAppear()函数中执行此操作。登录视图控制器有一个带有closeView()函数的导航栏,可在按下时弹出它。Swift3协议委托功能从来没有调用

在这个函数中,我调用委托函数来关闭呈现视图控制器,但是当控制器出现时,它会再次调用检查认证函数。我的委托函数关闭它永远不会被调用。有什么办法可以做到这一点?清楚的是,如果用户通过按下登录控制器上的关闭按钮取消登录,我希望它的呈现视图控制器也关闭。

这个问题似乎是在调用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

您需要在某处设置**委托。 – vadian

+0

把这个callCheckAuth方法也 – KKRocks

+0

如何设置委托和地点?我有另一个代表工作和使用相同的模式,但为了不同的目的。 – markhorrocks

回答

0

代替使用委托我发现我可以使用该代码来关闭一个视图控制器和它的父的。

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

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

     navigationController!.popToViewController(viewController, animated: true) 

    }