私はプログラミングにかなり慣れていないため、この問題を解決する方法が本当にわかりません。アプリ デリゲートに 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である場合も黒い画面が表示されます。...
それがなぜなのか誰にも分かりますか?