2015-08-16 47 views
0

成功登錄後,我試圖導航到標籤欄控制器。我寫的代碼粘貼在下面。打開標籤欄控制器登錄時的所有值

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

從你的代碼,它看起來像viewController和loginViewController是相同的視圖控制器是這個故意嗎?他們都是「MenuViewControllers」 – Loxx

+0

對不起,這是一個註釋的部分!它目前沒有在代碼中使用! – rafavinu

+0

我看到了,只需一秒鐘,我會告訴你,請評論代碼,以便我們知道這是什麼 – Loxx

回答

1

所以,這裏是一個簡單的方法來做到這一點,

的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等等。

祝你好運!