打开标签栏控制器,登录时显示所有值

时间:2015-08-16 03:42:49

标签: ios swift uitabbarcontroller presentviewcontroller

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

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?

1 个答案:

答案 0 :(得分:1)

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

的AppDelegate:

假设你想在你的app委托中设置它,如下所示:

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
    }

您决定进行此设置,因为假设您在上述方法中使用了一些身份验证方法,该方法在用户已经对自己进行身份验证后执行自动登录。现在,这将过滤已经过身份验证的用户和未经过身份验证的用户,然后将他们发送到将为他们提供登录或注册选项的视图。

因此,自动登录代码将设置一个标签栏控制器,将导航控制器作为选项卡,然后将控制器视为这些导航控制器的根。然后你调用主导航控制器“mainNav”并使用方法“setViewControllers”,你使用这个方法,以便你将应用程序的MAIN WINDOW的根设置为“mainNav”,然后设置“注册”或登录屏幕“到”mainNav“的根目录然后接下来是标签栏控制器,这将允许您创建一个”注销“功能,当您在注销后POP到应用程序委托的根视图控制器时然后,您将看到带有这些按钮的“登录”或“注册”屏幕,从而向用户表明他们确实已经注销。好的,现在我们已经掌握了这一点,让我们转到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,同样的事情,他们注册,你用tabbarcontroller和“启动画面注册/登录”视图控制器呈现应用代理mainVC,你就可以了。

现在您刚才做的是为您的应用创建了导航设置,其中Splash屏幕始终位于mainNav的ROOT处,而Tabbar Controller始终位于第二位。这将使您完全控制登录和注销以及注册。

这样做的方法是你将mainNav声明为AppDelegate的一个属性,它让你在整个应用程序中使用这个属性,所以从LoginVc和SignUpVc你总是可以从AppDelegate调用mainNav来设置你的viewcontrollers从而始终控制应用程序的整个层次结构。

这是一种非常先进的做事方式,如果你想深入了,它会比这更先进,例如,你可以随时使用AppDelegate的mainNav属性“presentViewController”,你可以每当你想要的时候在mainNav上执行“popToRootViewController”,整个应用程序都关闭,除了“启动画面”,它会向新的uesers提供“注册”或“登录”按钮。

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

条目POINT ===> mainVC然后mainVC有上面的东西,这是如何设置它,你有一个mainVC,然后是UITabBarController的每个选项卡的UINavigationController等等。

祝你好运!

相关问题