在呈现新的UITabBarController之前如何关闭rootViewController?

时间:2019-05-28 21:23:37

标签: ios swift

我已经在AppDelegate中将UIViewController设置为rootViewController,但是,当用户登录或跳过UIViewController时,我会在顶部显示一个UITabBarController。

我需要关闭LoginController,然后在用户登录后将UITabController设置为rootViewController。

我该如何进行重组?

AppDelegate()

window = UIWindow()
window?.makeKeyAndVisible()
window?.rootViewController = LoginController()

LoginController()

self.present(MainTabBarController(), animated: true, completion: nil)

3 个答案:

答案 0 :(得分:1)

您可以像这样设计代码。

This one

答案 1 :(得分:1)

维护是否登录用户(然后根据该状态)的状态太容易了。您可以导航到视图。

您可以尝试这种方式:

1。在AppDelegate中,您可以使用这些方法。

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

    let isLogin = UserDefaults.standard.bool(forKey: "IS_LOGIN")
    if isLogin == true {
        self.goToDashboardView()
    } else {
        self.goToLoginView()
    }
    return true
}

//MARK:- ------- Global Methods -------

class func sharedInstance() -> AppDelegate {
    return UIApplication.shared.delegate as! AppDelegate
}

func goToLoginView() {

    let sb = UIStoryboard.init(name: "Main", bundle: nil)
    let loginVC = sb.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
    let navVC = UINavigationController(rootViewController: loginVC) // You can skip this if you do not want to add navigation bar
    self.window?.rootViewController = navVC // if you skipped above line, then you have to assign 'loginVC' here.
    self.window?.makeKeyAndVisible()
}

func goToDashboardView() {

    let sb = UIStoryboard.init(name: "Main", bundle: nil)
    let tabbarVC = sb.instantiateViewController(withIdentifier: "MyTabBarController") as! MyTabBarController
    self).window?.rootViewController = tabbarVC // if you skipped above line, then you have to assign 'loginVC' here.
    self.window?.makeKeyAndVisible()
}

2。在LoginViewController中,当用户成功登录时。

@IBAction func btnLoginClicked(_ sender: UIButton) {

    // Your API call or other code
    // If all things goes well, then login and go to dashboard

    UserDefaults.standard.set(true, forKey: "IS_LOGIN")
    AppDelegate.sharedInstance().goToDashboardView()
}

3。最后,只要您想从应用程序中注销,无论何时何地,只需调用以下代码即可。

@IBAction func btnLogOutClicked(_ sender: UIButton) {

    // Your API call or other code
    // If all things goes well, then logout and go to login view

    UserDefaults.standard.set(false, forKey: "IS_LOGIN")
    AppDelegate.sharedInstance().goToLoginView()
}

4。Main.storyboard的设计应类似于: TabBar in Storyboard

答案 2 :(得分:0)

您无需先呈现UITabBarViewController然后关闭LoginViewController,只需在登录后将UITabBarViewController重置为您的应用程序的rootViewController即可,或者跳过以下操作:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

// Override point for customization after application launch.

let yourTabBar = UIStoryboard(name: "YOUR_STORYBOARD_NAME", bundle: nil).instantiateViewController(withIdentifier: "YOUR_UITABBARCONTROLLER_ID")
self.window!.rootViewController = yourTabBar
self.window!.makeKeyAndVisible()
return true
}