我剛剛開始使用iOS編程,到目前爲止,我在這裏找到的教程和答案對於向前邁進有很大的幫助。然而,這個特殊問題一直困擾着我整夜,我找不到一個「感覺正確」的答案。在應用程序啓動時從故事板中選擇替代第一個視圖控制器
我正在編寫一個連接到遠程服務的應用程序,用戶需要先登錄才能使用它。當他們開始使用應用程序時,他們的第一個視圖應該是登錄對話框;當他們之前通過身份驗證時,他們會立即看到概述頁面。
該項目使用故事板 - 我認爲這是一個很棒的功能 - 所以大多數選擇和加載根視圖控制器的代碼已經被處理。我以爲最好的地方加入我的邏輯是AppDelegate
的application:didFinishLaunchingWithOptions:
方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions
{
// select my root view controller here based on credentials present or not
return YES;
}
但是,這帶來了兩個問題:
這裏面具體的委託方法,根視圖控制器早已已根據故事板選定(並加載?)。我可以移動到加載過程中的較早位置來覆蓋第一個視圖控制器選擇,還是會不必要地使問題複雜化?
要覆蓋第一個視圖控制器,我需要對故事板的引用,但我找不到比使用
UIStoryboard
的storyboardWithName:bundle:
構造函數更好的方法。這感覺不對,應用程序應該已經有了故事板的參考,但是我怎樣才能訪問它?
更新
我計算出我有第二個問題,因爲我發現我的答案在這裏:
UIStoryboard: What's the Correct Way to Get the Active Storyboard?
NSBundle *bundle = [NSBundle mainBundle];
NSString *sbFile = [bundle objectForInfoDictionaryKey:@"UIMainStoryboardFile"];
UIStoryboard *sb = [UIStoryboard storyboardWithName:sbFile bundle:bundle];
以上將創建一個新的故事董事會實例;獲取活動實例,它是一大堆簡單:
UIStoryboard *sb = [[self.window rootViewController] storyboard];
在故事板文件本身,你必須設置要加載,如視圖標識符LoginDialog
。然後你實例化這樣的觀點:
LoginViewController *login = [sb instantiateViewControllerWithIdentifier:@"LoginDialog"];
[self.window setRootViewController:login];
在另一個視圖控制器,以下就足夠了:
UIStoryboard *sb = self.storyboard;
LoginViewController *login = [sb instantiateViewControllerWithIdentifier:@"LoginDialog"];
[self presentViewController:login animated:NO completion:nil];
'/ *對於故事板... */self.window.rootViewController =(YourViewController *)[[UIStoryboard storyboardWithName:@「Main」 bundle:nil] instantiateViewControllerWithIdentifier:@「YourViewControllerID」];' –