打开标签栏控制器登录时的所有值
成功登录后,我试图导航到标签栏控制器。我写的代码粘贴在下面。打开标签栏控制器登录时的所有值
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
}
您决定设置这是因为假设你在上面的方法中有一些验证方法,在用户已经验证自己的权限后执行自动登录。现在,这将过滤已经通过身份验证的用户和未通过身份验证的用户,如果他们未通过身份验证,则将其发送到可为其提供登录或注册选项的视图。
因此,自动登录代码将设置一个tabbar控制器,将导航控制器作为选项卡,然后将视图控制器作为这些导航控制器的根。然后你调用主导航控制器“mainNav”并使用方法“setViewControllers”,你可以使用这个方法,以便将应用程序的MAIN WINDOW的根设置为“mainNav”,然后设置“注册或登录屏幕“到”mainNav“的根,然后接下来是标签栏控制器,这将允许您创建一个”注销“功能,当您登录后POP到应用程序委托的根视图控制器时,然后用这些按钮向用户呈现“登录”或“注册”屏幕,由此向用户指示他们确实已经注销。好吧,现在我们已经完成了登录控制器:
在登录视图控制器中,成功验证后,您希望在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屏幕始终位于mainNav的ROOT处,而Tabbar控制器始终位于第二位置。这将使您完全控制登录和注销和注册。
这种方式的工作原理是将mainNav声明为AppDelegate的一个属性,该属性允许您在整个应用程序中访问此属性,因此从LoginVc和SignUpVc始终可以从AppDelegate调用mainNav来设置您的viewcontrollers,从而总是控制应用程序的整个层次。
这是一种非常先进的做事方式,如果你想深入一些,它会变得更加先进,例如,你可以随时随地使用AppDelegate的mainNav属性“presentViewController”可以随时在mainNav上执行“popToRootViewController”,并且整个应用程序关闭,除了用“注册”或“登录”按钮呈现新的uesers的“启动画面”。
这是迄今为止设置应用程序前端处理的最佳方式,一旦掌握了它,它就是最简单的方法,它使您能够控制整个导航堆栈而无需询问您的位置在应用程序中。你会很可能有这方面的问题,因为我看到你正在使用故事板,所以它是这样的:
entry POINT ===> mainVC然后mainVC有上面的东西,这是如何设置它,你有一个主VC,然后UITabBarController的每个选项卡的UINavigationController等等。
祝你好运!
从你的代码,它看起来像viewController和loginViewController是相同的视图控制器是这个故意吗?他们都是“MenuViewControllers” – Loxx
对不起,这是一个注释的部分!它目前没有在代码中使用! – rafavinu
我看到了,只需一秒钟,我会告诉你,请评论代码,以便我们知道这是什么 – Loxx