【问题标题】:How to invoke Navigation controller form a VC如何从 VC 调用导航控制器
【发布时间】:2020-01-13 10:27:06
【问题描述】:

我有 3 个 VC(在 ViewController 中的 VC)

1 AuthViewController 是应用程序的入口点,它会检​​查用户是否已登录,否则会显示与登录相关的视图

2 HomeViewController是用户登录后应用登陆页面的主界面

3 ListViewController 显示一个列表,通过 HomeViewController 上的 segue 调用。

我想通过导航控制器在 ListViewController 和 HomeViewController 之间启用反向导航。

如果我有一个根 VC 为 HomeVC 的导航控制器,我该如何实现。如何从我的 AuthVC 中调用它,以便使用 Navigation 控制器调用它。

我尝试调用导航控制器但没有成功

我也尝试通过

调用 HomeVC
 let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
     if let viewController = mainStoryboard.instantiateViewController(withIdentifier: "mainViewController") as? UIViewController {
        viewController.modalPresentationStyle = .overCurrentContext
         self.present(viewController, animated: true, completion: nil)

虽然我能够调用 HomeVC 却无法获得导航按钮

如何在不丢失 NavigationController 的情况下从 AuthVC 调用 HomeVC

【问题讨论】:

    标签: ios swift


    【解决方案1】:
    1. 您需要 1 个导航控制器,而不是 3 个。
    2. 如果要推送新控制器,请使用push 方法,而不是present
    3. 如果导航堆栈中有控制器并且当前控制器不是根视图控制器,则导航栏上的后退按钮会自动启用。
    4. 当从 AuthViewController 转到 HomeController 时,您应该更改 RootViewController。这样用户就无法返回 Auth 屏幕。那没有任何意义。
    5. 进入 HomeController 后,您可以使用以下代码推送其他控制器,它会自动为您的控制器添加一个后退按钮。

      let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
      if let viewController = mainStoryboard.instantiateViewController(withIdentifier: "mainViewController") as? UIViewController {
         self.navigationController?.pushViewController(vc, animated: true)
      }
      

    您也可以使用以下扩展名:

    extension UIViewController {
    
        func pushVC(storyboardName : String, vcname : String)  {
            let vc = UIStoryboard.init(name: storyboardName, bundle: Bundle.main).instantiateViewController(withIdentifier: vcname)
            vc.hidesBottomBarWhenPushed = true
            self.navigationController?.pushViewController(vc, animated: true)
        }
    
        func popVC() {
            self.navigationController?.popViewController(animated: true)
        }
    
        func makeRootVC(storyBoardName : String, vcName : String) {
    
            let appDelegate = UIApplication.shared.delegate as! AppDelegate
            let vc = UIStoryboard(name: storyBoardName, bundle: Bundle.main).instantiateViewController(withIdentifier: vcName)
            let nav = UINavigationController(rootViewController: vc)
            nav.navigationBar.isHidden = true
            appDelegate.window?.rootViewController = nav // If using XCode 11 and above, copy var window : UIWindow? in your appDelegate file
            let options: UIView.AnimationOptions = .transitionCrossDissolve
            let duration: TimeInterval = 0.6
            UIView.transition(with: appDelegate.window!, duration: duration, options: options, animations: {}, completion: nil)
        }
    }
    

    【讨论】:

    • 我确实只有一个导航控制器,但我有 3 个 Vc 我想一旦我完成了我的身份验证,我需要将根视图控制器更改为主页。我应该如何处理需要重新认证用户的情况?
    • @MahiTejGvp 然后再次使用上面的makeRootVC() 函数将 rootViewController 更改为您的 AuthenticationController。
    猜你喜欢
    • 2019-11-22
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    相关资源
    最近更新 更多