私はログイン状態をチェックする必要がある様々な他のビューコントローラによって呼び出されるログインビューコントローラを持っています。これは、viewWillAppear()関数でこれを行います。ログインビューコントローラには、押されたときにポップするcloseView()関数を持つナビゲーションバーがあります。Swift3プロトコルデリゲート関数が呼び出されなかった
この関数では、デリゲート関数を呼び出して、表示されているビューコントローラも閉じますが、そのコントローラは、表示されたらcheck auth関数を再度呼び出します。それを閉じるための私のデリゲート関数が呼び出されることはありません。私はこれを達成する方法はありますか?ユーザーがログインコントローラーの閉じるボタンを押してログインをキャンセルした場合は、そのプレゼンテーションビューコントローラーも閉じるようにします。
viewWillAppear()
のcheckAuth()
の呼び出しが、代理関数が呼び出される前にトリガーされるという問題があるようです。
ここに私のコードです。
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)
}
}
**デリゲートを**どこかに設定する必要があります。 – vadian
このcallCheckAuthメソッドを追加 – KKRocks
デリゲートをどこに設定するのですか?私は別の代理人が同じパターンを使用し、別の目的のために使用しています。 – markhorrocks