所以,這裏是一個簡單的方法來做到這一點,
的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