登录时使用所有值打开选项卡栏控制器

Open Tab Bar controller with all values on login

成功登录后,我正在尝试导航到标签栏控制器。我写的代码贴在下面。

let storyboard = UIStoryboard(name: "Main", bundle: nil)
var viewController = storyboard.instantiateViewControllerWithIdentifier("MenuViewController") as! MenuViewController
let nav = UINavigationController(rootViewController: viewController)
self.presentViewController(nav, animated: true, completion: nil)

它正在正确重定向到第一个选项卡 (MenuViewController)。但是,其余选项卡元素不可见。任何人都可以建议,如果我可以直接调用 tabbarcontroller 而不是第一个 viewcontroller?

所以,这是一个简单的方法,

AppDelegate:

假设您想在您的应用委托中像这样进行设置:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var navMain = UINavigationController()

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

        if (authenticated) {
            var first = UIViewController(nibName: nil, bundle: nil)
            var nav1 = UINavigationController()
            nav1.viewControllers = [first]

            var second = UIViewController(nibName: nil, bundle: nil)
            var nav2 = UINavigationController()
            nav2.viewControllers = [second]

            var tabs = UITabBarController()
            tabs.viewControllers = [nav1, nav2]

            var LoginSignUpSplashPage = UIViewController(nibName: nil, bundle: nil)

            navMain = UINavigationController()
            self.window!.rootViewController = navMain;
            navMain .setViewControllers([LoginSignUpSplashPage, tabs], animated: true)

        } else {
            var loginVC = UIViewController(nibName: nil, bundle: nil)
            navMain = UINavigationController()
            self.window!.rootViewController = navMain;
            navMain .setViewControllers([loginVC], animated: true)
        }

        self.window?.makeKeyAndVisible();

        return true
    }

你决定设置它是因为假设你在上面的方法中有一些身份验证方法,在用户已经对自己进行正确的身份验证后执行自动登录。现在,这将过滤已经通过身份验证的用户和未通过身份验证的用户,如果他们未通过身份验证,则将他们发送到一个视图,该视图将为他们提供登录或注册选项。

因此,自动登录代码将设置一个选项卡栏控制器,将导航控制器放置为选项卡,然后将视图控制器作为这些导航控制器的根。然后你调用主导航Contoller "mainNav" 并使用方法"setViewControllers",你使用这个方法让你将应用程序的MAIN WINDOW 的根设置到"mainNav" 然后将 "sign up or login screen" 设置到 "mainNav" 的根目录,然后是标签栏控制器,这将允许您创建一个 "log out" 函数,当您 POP 到注销后应用程序委托的根视图控制器,您将看到带有这些按钮的 "log in" 或 "sign up" 屏幕,从而向用户表明他们确实已注销。好的,现在我们已经确定了,让我们转到 LoginViewController:

在登录视图控制器中,在成功验证后,您希望在 AppDelegate 中进行相同的设置,因此您可以这样做:

AFTER AUTHENTICATION:
     let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        let appDelegateVar = appDelegate.navMain

        var first = UIViewController(nibName: nil, bundle: nil)
        var nav1 = UINavigationController()
        nav1.viewControllers = [first]

        var second = UIViewController(nibName: nil, bundle: nil)
        var nav2 = UINavigationController()
        nav2.viewControllers = [second]

        var tabs = UITabBarController()
        tabs.viewControllers = [nav1, nav2]

        var LoginSignUpSplashPage = UIViewController(nibName: nil, bundle: nil)

        appDelegateVar .setViewControllers([LoginSignUpSplashPage, tabs], animated: true)

同样的事情适用于 SignUpViewController,同样的事情,他们注册,你向应用程序委托 mainVC 展示 tabbarcontroller 和 "splash screen sign up/login" 视图控制器,你就设置好了。

现在您所做的是为您的应用程序创建一个导航设置,其中启动画面始终位于 mainNav 的根目录,而 Tabbar 控制器始终位于第二位。这将使您完全控制登录、注销和注册。

它的工作方式是您将 mainNav 声明为 AppDelegate 的 属性,这使您可以在整个应用程序中访问此 属性,因此您始终可以从 LoginVc 和 SignUpVc从 AppDelegate 调用 mainNav 来设置您的视图控制器,从而始终控制应用程序的整个层次结构。

这是一种非常先进的做事方式,如果您想更深入,它甚至比这更先进,例如,您可以 "presentViewController" 使用 mainNav 属性 AppDelegate 只要你想,你也可以在 mainNav 上执行 "popToRootViewController" 并且整个应用程序都会关闭,除了 "splash screen" 向新用户显示 "sign up" 或"log in" 按钮。

这是迄今为止设置应用程序前端处理的最佳方式,一旦掌握了它,它就是最简单的方式,它使您能够控制整个导航堆栈,而无需质疑在哪里你在应用程序中。你很可能对此有疑问,因为我看到你正在使用故事板,所以它是这样的:

入口点 ===> mainVC 然后 mainVC 有上面的东西,这是设置它的方法,你有一个 mainVC,然后是 UITabBarController 的每个选项卡的 UINavigationController,等等

祝你好运!