Swift 中 HomeVC 退出按钮的导航 rootViewController 问题

Navigation rootViewController issue with HomeVC Sign out Button in Swift

我有主视图控制器,侧面菜单有 ENSideMenu,在主视图控制器中,我有注销按钮。我已经将 ENSideMenu MyNavigationController 作为情节提要中的初始视图控制器。

我想先在应用程序中显示主页,它工作正常,但是当我从登录主页返回主页时主页没有响应.. 一旦我退出然后主页再次响应。

这是我的代码:

在 appdelegate 中:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    let userId: String? = KeychainWrapper.standard.string(forKey: "Uid") 
    print("appdelegate userid \(userId)")
    if userId != nil{
        let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let homeVC = mainStoryBoard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
        self.window!.rootViewController = homeVC
    }
    return true
}

在 LogInVC 的登录按钮中:

    let saveUserId: Bool = KeychainWrapper.standard.set(Uid ?? "", forKey: "Uid")
                print("the userid is \(saveUserId)")

                if (Uid?.isEmpty)!
                {
                    print("login fail")
                }
                else{

                    DispatchQueue.main.async {

                        let homeVC = self.storyboard?.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
                        let appDelagate = UIApplication.shared.delegate
                        appDelagate?.window??.rootViewController = homeVC
                    }
                }

在 HomeVC 中:

  func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "MakePaymentViewController") as! MakePaymentViewController
    self.navigationController?.pushViewController(nextViewController, animated: true)
    let indexPathHome = indexPath.row
    print("home collectionItem indexpath \(indexPathHome)")

}


 @IBAction func signOutButton(_ sender: Any) {
    print("signout tapped")
    KeychainWrapper.standard.remove(key: "Uid")
 }

  @IBAction func sideMenuButton(_ sender: Any) {
    print("in side menu")
    toggleSideMenuView()
 }

我已经将 ENSideMenu MyNavigationController 作为情节提要中的初始视图控制器。

我需要 homeVc 在登录后响应。 请帮我解决问题。

您正在使用带有 HomeViewController 的自定义 MyNavigationController 进行导航 - 您已经提到,这是您在情节提要中的初始视图。但是......还有另外两个地方,你正在加载 HomeViewController 而没有 MyNavigationController:

  1. AppDelegate

更改加载 HomeViewController:

let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
window?.rootViewController = mainStoryBoard.instantiateViewController(withIdentifier: "MyNavigationController")
  1. LoginViewController

改变

let homeVC = self.storyboard?.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
let navigationController = UINavigationController(rootViewController: homeVC)

let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
let navigationController = mainStoryBoard.instantiateViewController(withIdentifier: "MyNavigationController")

另外,我有一些建议给你:

  1. 避免在代码中使用 ! - 这是导致应用程序崩溃的直接方法。还有很多其他方法可以处理可选值
  2. 避免在闭包中捕获强 self(如在 LoginViewController 中,当您将视图更改为 HomeVC 时)。这会导致保留循环,从而导致内存泄漏。
  3. 删除所有不需要的 selfs - 当编译器告诉您,您需要添加 self - 查看第 2 点)并添加 weak self 而不是 strong.
  4. 删除编译器警告 - 您已经有 19 个警告,您可以在几分钟内删除所有警告。