成功登录后,我正在尝试导航到标签栏控制器。我写的代码粘贴在下面。
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?
答案 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等等。
祝你好运!