从导航控制器转到选项卡控制器视图

时间:2018-08-17 11:59:26

标签: ios swift uitabbarcontroller viewcontroller

我正在开发iOS应用。并且客户有一些设计限制。因此,看起来我必须在不同数量的Viewcontroller上同时使用导航控制器和选项卡控制器。

我可以将我的观点分为2类。

  1. 注册/登录视图(这是应用程序首次启动时的入口点)
  2. MainView->用户登录后,这将成为入口点

现在类别1正在使用NavigationView控制器。就像Category2在使用Tab栏控制器一样。

我想要的情况1:我想要的是,当用户安装我的应用程序时,他被带到具有导航视图的登录视图。现在,如果他已经没有帐户,则将转到“创建新帐户”,这是“导航”视图的第二个场景。现在成功创建帐户后,他需要关闭所有其他导航视图控制器,并需要跳转到MainView(将成为Tabbar视图控制器)。

情况2::假设用户登录后关闭了我的应用程序,当他再次打开它时,现在的输入点将是Mainview,它具有Tab栏视图控制器。现在我知道我需要在App委托方法中执行此操作,但是如何?

我正在这样做,看起来很正常。但是我没有得到最底层的标签。为什么会这样?

class ViewSwitcher {

    static func updateRootViewController() {

        let status = UserDefaults.standard.bool(forKey: KeyConstants.IS_USER_LOGGEDIN)
        var rootViewController : UIViewController?

        #if DEBUG
            print(status)
        #endif

        if (status == true) {
            let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
            let mainTabBarController = mainStoryBoard.instantiateViewController(withIdentifier: "idTab1VC") as! Tab1VC
            rootViewController = mainTabBarController
        } else {
            let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
            let signInViewController = mainStoryBoard.instantiateViewController(withIdentifier: "idLoginVC") as! LoginVC
            rootViewController = signInViewController
        }

        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.window?.rootViewController = rootViewController

    }

}

任何想法如何处理这些情况?如何通过关闭所有视图控制器树来以编程方式进行导航?

4 个答案:

答案 0 :(得分:1)

与我的应用程序相同的过程。

使用此代码来更改Case2中的rootViewController

var window: UIWindow?
var tabBarController : UITabBarController?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        // Tabbar controller
        let storyBoard = UIStoryboard.init(name: "Main", bundle: Bundle.main)
        let tab1 = UINavigationController.init(rootViewController: storyBoard.instantiateViewController(withIdentifier: "tab1"))
        tab1 = UITabBarItem.init(title: "Title 1", image: UIImage(named : "Image.png") , tag: 0)
        let tab2 = UINavigationController.init(rootViewController: storyBoard.instantiateViewController(withIdentifier: "tab2"))
        tab2 = UITabBarItem.init(title: "Title 2", image: UIImage(named : "Image.png") , tag: 1)

        // Navigation controller or Login view controller
        let nav1 = UINavigationController.init(rootViewController: storyBoard.instantiateViewController(withIdentifier: "nav1"))

        tabBarController = UITabBarController.init()
        tabBarController?.delegate = self
        tabBarController?.selectedIndex = 0
        tabBarController?.viewControllers = [tab1,tab2]

       // The Bool value which you have to set as True after a user logged in 
        if UserDefaults.standard.bool(forKey: "LoggedIn"){
            print("Tabbar")
            self.window?.rootViewController = self.tabBarController
        }else{
            print("Navigation")
            self.window?.rootViewController = nav1
        }

        return true
    }

在此之前或之后,您必须编写与用户点击loginViewController中的登录名相同的代码,在本例中为Case1

     func loginClicked(){
         UserDefaults.standard.set(true, forKey: "LoggedIn")
         DispatchQueue.main.async {
            let appdelegate = UIApplication.shared.delegate as! AppDelegate
            // Same as above code and replace self with appDelegate without if condition and at last
            appdelegate.window?.rootViewController = appdelegate.tabBarController
         }
      }

用户注销后

         DispatchQueue.main.async {
                    UserDefaults.standard.set(false, forKey: "LoggedIn")
                    let appdelegate = UIApplication.shared.delegate as! AppDelegate
                    let story = UIStoryboard.init(name: "Main", bundle: Bundle.main)
                    let nav1 = UINavigationController.init(rootViewController: storyBoard.instantiateViewController(withIdentifier: "nav1"))
                    appdelegate.window?.rootViewController = companyNavigation
}

答案 1 :(得分:0)

在应用程序委托didFinishWithLaunchingOptions中使用以下代码直接进入主视图。此处uid表示是否要检查用户是否处于活动状态的存储值。

AnnotatedMountScanner

注册/登录视图 }

答案 2 :(得分:0)

逐步的方法是:

  1. 检查用户是否登录。为此,请使用UserDefaults。
  2. 如果用户未登录,则将LoginVC设置为rootVC。​​
  3. 在登录时,在UserDefault中保存一个密钥以表示已登录的用户。
  4. 下次用户打开应用程序时,检查密钥,如果用户登录,则将TabBarVC设置为rootViewController。
  5. 注销时,清除密钥。

以上示例代码为:

  

AppDelegate.swift

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
    {
            ...........

        //Check for user login and set rootViewController.
        if UserDefaults.standard.bool(forKey: "login"){
            self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()
        }
        else{
            self.window?.rootViewController = UIStoryboard(name: "Login", bundle: nil).instantiateInitialViewController()
        }
        return true
    }
  

登录成功后

    func loginUser(){
       ...
       if userLoginSuccess{
        UserDefaults.standard.set(true, forKey: "login")
    }
}
  

注销时

UserDefaults.standard.set(false, forKey: "login")

答案 3 :(得分:0)

就像您知道要在Appdelgate中进行操作一样。

成功登录用户后,必须将标记存储在userdefault中。 在应用程序委托中,您必须检查是否设置了此标志。如果设置了此标志,请使用初始视图控制器调用 moveToLoginWindow()创建导航视图控制器。 否则,请创建标签栏视图控制器调用 movetoTabBarController()

func moveToLoginWindow() -> Void {

        if let rootController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginVC") as? LoginVC{
            let navigationController = UINavigationController.init(rootViewController: rootController)
            self.window?.rootViewController = navigationController
            self.window?.makeKeyAndVisible()
        }
    }


func movetoTabBarController() -> Void {

    let nav2 = UINavigationController()

    let second = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "secondViewController") as? SecureNotesVC
    nav2.viewControllers = [second!]
    nav2.tabBarItem =  UITabBarItem.init(title: "Titel 2", image: UIImage.init(named: "2.png"), selectedImage: UIImage.init(named: "2_sel.png"))


    let nav3 = UINavigationController()

    let third =  UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "thirdviewController") as? FormFillsVC
    nav3.viewControllers = [third!]
    nav3.tabBarItem = UITabBarItem.init(title: "Titel 2", image: UIImage.init(named: "3.png"), selectedImage: UIImage.init(named: "3_sel.png"))


    let nav4 = UINavigationController()

    let fourth = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "fourthviewContoller") as? SettingsVC
    nav4.viewControllers = [fourth!]
    nav4.tabBarItem =  UITabBarItem.init(title: "4", image: UIImage.init(named: "4.png"), selectedImage: UIImage.init(named: "4_sel.png"))




    if #available(iOS 11.0, *) {
        nav2.navigationBar.prefersLargeTitles = true
        nav3.navigationBar.prefersLargeTitles = true
        nav4.navigationBar.prefersLargeTitles = true
    }

    let tabBarController = UITabBarController()
    tabBarController.viewControllers = [ nav2,nav3, nav4,nav5]
   self.window!.rootViewController = tabBarController;






 }