2014-10-30 57 views
0

現在我試圖故事板了,我有我的UITableViewController作爲我的rootViewController。現在,在某些情況下,如果我的用戶未登錄,我想先看到另一個UIViewController。我知道我可以執行一個segue它,但從我的理解TableView仍然會嘗試加載,這不是我想要的,除非他們提供有關此UIViewController的信息,我試圖首先出現(if說一個關鍵不存在於NSUserDefaults)例如。簡單的方法來覆蓋哪個屏幕顯示第一個iOS

所以我的問題是,有一個簡單的解決方案,我也許可以添加到我的appDelegate爲「覆蓋」的rootViewController從情節串連圖板,或出現前,然後有一個按鈕,只需在其辭退回到了那個rootViewController在故事板?

謝謝!

回答

0

,你可以:

  • 使用不同的初始視圖控制器(可以在故事板指定此)。在該視圖控制器中,檢查用戶是否已登錄。如果是,則通過手動觸發的segue直接轉換到表視圖控制器。如果沒有,則顯示登錄屏幕。

  • 子類UITableViewController。檢查viewDidLoad中的登錄。如果不是,則提供一個模態登錄視圖控制器。

你可能不想做它在應用程序的委託,因爲這將需要您手動加載故事板,這意味着不必要的代碼。

+0

竊不以爲然。這將導致「登錄屏幕」始終被創建,即使它不是必需的。我會在應用程序委託中進行手動初始化。 – ullstrm 2014-10-31 06:38:12

+0

這是一個不成熟的優化。 iOS始終加載和卸載視圖控制器。我們爲什麼不相信它做正確的事情?實際上,應用程序委託中的初始化過度限制了操作系統 - 它被迫在特定的時間加載故事板。我們如何知道在didFinishLaunchingWithOptions被調用的時候它還沒有加載故事板?在高級編程環境中 - 尤其是iOS - 最好不要與系統對抗。 – 2014-10-31 08:57:28

+1

你也可以爭辯說,登錄屏幕不應該在viewDidLoad中處理這個邏輯。在我看來,它應該在它的「外面」處理。這不僅僅是過早優化的哲學問題。 – ullstrm 2014-10-31 09:14:31

0

例如,如果用戶未登錄,一個簡單的方法是將表格部分設置爲0;

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
NSInteger numberOfSections = 0; 
if (userLoggedIn) 
{ 
    numberOfSections = 1; 
} 

return numberOfSections; 
} 
+0

如果我走了這條路線,你會碰巧知道在UITableView中間顯示文字的最佳路線,例如「未登錄」嗎?在這種情況下簡單地隱藏一個按鈕然後不隱藏是最佳實踐,反之亦然? – Joey 2014-10-30 16:40:18

+0

當我完成它時,我剛剛在視圖中間添加了一個UILabel。但是,由於您要立即繼續使用其他UIViewController,因此這可能不是必需的,特別是如果這是一個模態視圖。 – Gismay 2014-10-30 16:48:18

1

真的類似於這樣的問題:UIStoryboard load from app delegate

你應該在視圖控制器在Interface Builder的標識部分設置故事板ID。然後,你可以通過

UIViewController *viewControllerToShow = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"]; 

獲取屏幕上,你最終會像這樣的東西:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:[NSBundle mainBundle]]; 

     UIViewController *vc = nil; 
     if (someKindOfCheck) { 
      vc = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"]; 
     } 
     else { 
      vc =[storyboard instantiateInitialViewController]; 
     } 

     // Set root view controller and make windows visible 
     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
     self.window.rootViewController = vc; 
     [self.window makeKeyAndVisible]; 

    return YES; 
} 
+0

而不是初始化故事板的新實例,如果只有一個故事板,則可以使用self.window.rootViewController.storyboard。 – ullstrm 2014-10-31 06:36:36