0

私はプログラミングにかなり慣れていないため、この問題を解決する方法が本当にわかりません。アプリ デリゲートに rootviewcotnroller を実装して、ユーザーがログインしている場合、ログイン ビュー コントローラーではなく、アプリ コンテンツに直接プッシュされるようにしました。ただし、実際には機能しません。すでに述べたように、アプリのデリゲートに次のコードを追加しました。

    window = UIWindow(frame: UIScreen.main.bounds)
    window?.makeKeyAndVisible()
    window?.rootViewController = MainViewController()

MainViewcontroller は次のように設定されています。

class MainViewController: UINavigationController {

override func viewDidLoad() {
    super.viewDidLoad()
    if isLoggedIn() {
        let homeController = UserViewController()
        viewControllers = [homeController]

    }else {

        perform(#selector(showLoginController), with: nil, afterDelay: 0.01)
    }
}

fileprivate func isLoggedIn() -> Bool {
    return UserDefaults.standard.isLoggedIn()
}

func showLoginController() {
    let loginController = LoginViewController()
    present(loginController, animated: true, completion: {

    })
 }
}

Userviewcontroller に次の行を追加しました。

 func handleSignout() {

    UserDefaults.standard.setisLoggedIn(value: false)
    print("is logged out")

}

@IBAction func SignOut(_ sender: Any) {

    handleSignout()
    if FIRAuth.auth()!.currentUser != nil {

        do {
        try? FIRAuth.auth()?.signOut()

            if FIRAuth.auth()?.currentUser == nil {
                let loginViewViewcontroller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Login") as! LoginViewController
                self.present(loginViewViewcontroller, animated: true, completion: nil)
            }
        }   
    }
}

次に、ユーザーがログインしているかログアウトしているかに関係なくブール値を保存するために、UserDefaults を使用して拡張機能を作成しました。

extension UserDefaults {

enum UserDefaultKeys: String {
    case isLoggedIn
}

func setisLoggedIn(value: Bool) {
    set(false, forKey: UserDefaultKeys.isLoggedIn.rawValue)
    synchronize()   
}

func isLoggedIn() -> Bool {
    return bool(forKey: UserDefaultKeys.isLoggedIn.rawValue)
}

}

一見すると黒い画面が表示される LoginviewController に、次のように追加しました。

  func finishLoggingIn() {

    let rootViewController = UIApplication.shared.keyWindow?.rootViewController
    guard let MainNavigationController = rootViewController as? MainViewController else {return}
    MainNavigationController.viewControllers = [UserViewController()]
    print("is logged in")
    UserDefaults.standard.setisLoggedIn(value: true)

    dismiss(animated: true, completion: nil)

}

この関数は、ユーザーがログイン ボタンを押したときに呼び出されます。

アプリはユーザーがログインしているかどうかを認識しますが、ユーザーがログインしているかどうかは関係ありません。表示される最初のビュー コントローラーには黒い画面が表示されます。これはおそらく loginviewcontroller ですが、ユーザーがログインしている場合userviewcontroller では、表示される最初のView Controllerである場合も黒い画面が表示されます。...

それがなぜなのか誰にも分かりますか?

4

1 に答える 1