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

标签 swift uicollectionview uinavigationcontroller uibutton rootviewcontroller

我有带 ENSideMenu 的主视图 Controller 用于侧面菜单,在主视图 Controller 中我有注销按钮。我已将 ENSideMenu MyNavigationController 作为 Storyboard 中的初始 View Controller 。

我想先在应用程序中显示主页,该应用程序工作正常,但当我从登录到主页时,主页没有响应。一旦我注销,主页就会再次响应。

这是我的代码:

在应用委托(delegate)中:

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 的 loginButton 中:

    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 作为 Storyboard 中的初始 View Controller 。

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

最佳答案

您正在将自定义 MyNavigationControllerHomeViewController 用于导航目的 - 您已经提到,这是您在 Storyboard 中的初始 View 。但是...还有另外两个地方,您在没有加载 MyNavigationController 的情况下加载 HomeViewController:

  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 中,当您将 View 更改为 HomeVC 时)。这会导致保留循环,从而导致内存泄漏。
  3. 删除所有不需要的 self - 当编译器告诉您,您需要添加 self - 查看第 2 点)并添加 weak self 而不是 strong
  4. 移除编译器警告 - 您已经有 19 个警告,您可以在几分钟内移除所有警告。

关于swift - Swift 中 HomeVC 退出按钮的导航 rootViewController 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58060024/

相关文章:

最后一个单元格的 UICollectionView 布局

ios - 如何在 Swift 中为 View 集合中的每个单元格添加弹出窗口

ios - 键盘打开时推送到其他 View Controller

ios - 导入具有一些 iOS 9+ 兼容逻辑的 iOS 8 框架

swift - 涉及快速调整 UICollectionviewCell 大小的步骤

ios - 自定义 CollectionViewLayout 不适用于 Swift 3

ios - 导航项按钮未显示

swift - xcode - NavigationBarItem - 将图像更改为文本

Swift:UIPanGestureRecognizer 反向滑动错误

ios - AVCaptureSession 崩溃