2012-03-23 174 views
0

我查看了建議列表,沒有看到任何似乎符合我的困境的東西。故事板:更改故事板中指定的UINavigation控制器的根視圖

我正在寫我的第一個故事板項目。我有一個管理4個選項卡的UITabBarController。每個選項卡都有一個UINavigationController作爲其根,以及每個選項卡中的許多視圖。

其中一個導航堆棧實際上是3個視圖控制器的「環」。我用一個自定義的segue用一個簡單的替換(我把一個視圖放在一個視圖上)來代替通常的導航堆棧的「堆疊」。

這很奇妙。故事板和自定義segue正是醫生所訂購的。

但是,我想讓用戶選擇他們開始的3個視圖中的哪一個(成爲導航堆棧的根)。故事板堅持我選擇其中一個作爲根,所以我這樣做。但是,在運行時,用戶可能希望初始視圖不同,所以我希望導航堆棧具有不同的視圖。

在一個基於筆尖的應用程序中,我只是從一個筆尖實例化一個新的控制器,並用該控制器替換當前的根。

我該如何挑選控制器並在故事板中執行此操作?

+0

好的。我想我已經擁有了。這有點迂迴,但UIStoryboard :: instantiateViewControllerWithIdentifier方法是我所需要的。我只需要得到適當的故事板就位。當我讓它滿意時,我會發布代碼。 – 2012-03-23 22:07:25

回答

0

更新:感謝評論in another thread,我能夠簡化這一點。

好的。我想到了。

而不是取代根,我只需推開適當的控制器。這是因爲更改根目錄需要重新實例化控制器,而狐狸只是不值得追逐。這對UX沒有影響,所以我們這樣做:

/**************************************************************//** 
\brief Selects the initial search screen, depending on the user's choice. 
*****************************************************************/ 
- (void)selectInitialSearchAndForce:(BOOL)force   ///< If YES, then the screen will be set to the default, even if we were already set to one. 
{ 
    UITabBarController *tabController = (UITabBarController *)self.window.rootViewController; 

    [tabController setSelectedIndex:0]; // Set the tab bar to the search screens. 

    if (force) 
     { 
     UIStoryboard *st = [tabController storyboard]; 

     [[searchNavController navigationController] popToRootViewControllerAnimated:NO]; 

     UIViewController *newSearch = nil; 

     switch ([[BMLT_Prefs getBMLT_Prefs] searchTypePref]) 
      { 
      case _PREFER_MAP_SEARCH: 
      if ([[UIDevice currentDevice] userInterfaceIdiom] != UIUserInterfaceIdiomPad) // The map and simple searches are combined, on the iPad. 
       { 
       newSearch = [st instantiateViewControllerWithIdentifier:@"map-search"]; 
       } 
      break; 

      case _PREFER_ADVANCED_SEARCH: 
      newSearch = [st instantiateViewControllerWithIdentifier:@"advanced-search"]; 
      break; 
      } 

     if (newSearch) // We push the controller, as opposed to changing the root, because it's easier, and doesn't violate any of our ground rules. 
      { 
      [[searchNavController navigationController] pushViewController:newSearch animated:NO]; 
      // In the case of the iPad, we use a standard navbar push, so we need to prime the simple view to properly populate the Advanced view back button. 
      if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
       { 
       UIViewController *simpleViewController = [[[searchNavController navigationController] viewControllers] objectAtIndex:0]; 

       simpleViewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString([[simpleViewController navigationItem] title], nil) 
                             style:UIBarButtonItemStyleBordered 
                             target:nil 
                             action:nil]; 
       } 
      } 
     } 
} 
相關問題