2014-03-12 39 views
0

我有UIViewController,它包含另外兩個UIViewControllers作爲屬性。在父視圖控制器中管理少數UIViewControllers

MenuViewController包含:

@property (nonatomic, strong) TeamsViewController *teamsViewController; 
@property (nonatomic, strong) ResultsViewController *resultsViewController; 

的MenuViewController包含表視圖,當電池「秀團隊」我需要初始化teamsViewController並顯示teamsViewController查看用戶點擊。當用戶按下單元格「顯示結果」時,同樣的事情,但在這種情況下,我需要顯示resultsViewController視圖。

所以,我通常這樣做是在單元格被按下時以一種方式初始化控制器,並調用addSubview方法來添加控制器視圖。但我認爲這是不好的解決方案,我是對的嗎?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (_teamsViewController) _teamsViewController = nil; 
    _teamsViewController = [TeamsViewController new] 
    [self.view addSubView:_teamsViewController]; 

} 

上述方法是否正常?

我的層次結構視圖,每個人都由自己的控制器管理。因此,您由MenuViewController管理的白色和由ResultViewController管理的灰色視圖以及由TeamsViewController管理的藍色視圖。

正如我之前所說的,當我點擊菜單視圖控制器中的適當單元格時,我需要顯示團隊或結果。但是每個視圖都有另一個視圖控制器。或者,也許我對視圖控制器範例感到困惑?也許TeamsViewController應該是一個TeamsView和ResultsViewController應該是ResultsView?所以這兩個視圖控制器都有在其控制器中管理的表格。所以我不認爲它必須是UIView而不是UIViewController。

enter image description here

+0

它可能更容易使用一個uinavigationcontroller作爲MenuViewController的基類,並推動其他視圖控制器到導航堆棧,這也會給你內置'後'功能。 – JiuJitsuCoder

+0

@MySpecialPurpose,但在這種情況下,我需要在主視圖控制器視圖上添加uinaviagtioncontroller視圖嗎? –

+0

這是一個iPad應用嗎? – 3lvis

回答

1

我認爲最好的辦法是到其設置爲一個UINavigationController。 UINavigationController繼承自UIViewController,所以你不會以這種方式失去任何功能。然後,您可以設置它是這樣的:

//MenuViewController.h 
@interface MenuViewController : UINavigationController 
    @property (nonatomic, strong) TeamsViewController *teamsViewController; 
    @property (nonatomic, strong) ResultsViewController *resultsViewController; 
    //Insert other properties and methods.... 

@end 

,並在當有人點擊一個單元調用的方法,您只需將做到這一點:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (!self.teamsViewController) { 
     self.teamsViewController = [[UIViewController alloc] initWithNibName:@"nibName" bundle:nil]; 
    } 
    [self pushViewController:self.teamsViewController animated:YES]; 
} 

現在,你有兩個視圖控制器,所以你必須告訴你的方法高於哪一個推入堆棧。如果行是固定的,你可以根據indexPath簡單地決定顯示哪一個,但如果它更動態(即tableview是從數據庫創建的),那麼你需要在這裏有一些更復雜的邏輯代碼。

沒有太多的假設,但爲了給你一些一般的指導,當你創建一個單元格時,你通常會設置某種標誌來指示它是什麼類型。如果你只有兩種狀態(我更喜歡儘可能使用ENUM,因爲它們更具描述性),這可以用NS_ENUM或簡單的BOOL完成。然後您會檢查tableView:didSelectRowAtIndexPath:方法中是否存在該標誌,並將相應的視圖推送到導航堆棧上。像這樣的東西(這不是文字代碼,但表現出來的只是給你一個想法:

// This code assumes in the method tableView:cellForRowAtIndexPath: 
// you have set the tag property to '1' if a TeamsViewController is 
// needed or '2' if a ResultsViewController is needed when that cell 
// is pressed. 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     self.teamsViewController = self.teamsViewController ? self.teamsViewController : [[UIViewController alloc] initWithNibName:@"TeamsViewController" bundle:nil]; 
     self.resultsViewController = self.resultsViewController ? self.resultsViewController : [[UIViewController alloc] initWithNibName:@"ResultsViewController" bundle:nil]; 
     switch ([[tableView cellForRowAtIndexPath:indexPath] tag]) { 
      case 1: 
       [self pushViewController:self.teamsViewController animated:YES]; 
       break; 
      case 2: 
       [self pushViewController:self.resultsViewController animated:YES]; 
       break; 
      default: 
       break; 
     } 
    } 

你仍然需要做的初始化在你的團隊或結果視圖控制器來顯示視圖,但這應該引導你在一般的方向

+0

請檢查它是我正在尋找的來源https://bitbucket.org/matrosovDev/ios-manage-few-view-controllers你能評論它嗎? –

+0

我檢出了你的代碼。嘗試設置您的視圖控制器從UIViewController.m中的UINavigationController繼承。您通常不會將導航控制器放在子視圖位置,它應該是根控制器,並且應該負責。 – JiuJitsuCoder

+0

但它似乎是行不行的?這是我的問題 –

1

我推薦使用故事板,並確保有一個「故事板ID」爲他們每個人。這樣,根據需要推動各種UIViewController實例變得更容易一些。這是我的典型模式:

UIViewController *vc = [self.storyboard 
    instantiateViewControllerWithIdentifier:@"selected identifier"]; 
[self.navigationController pushViewController:vc animated:YES]; 

而且,除非你需要在子視圖控制器設置屬性,有沒有必要有一個屬性引用。此外,此答案假定您使用的是UINavigationController,您的MenuViewController設置爲rootViewController。你可以用一個故事板(簡單,可能是首選方式),或在像這樣的代碼在IB無論此設置:

MenuViewController *vc = [[UIViewController alloc] initWithNibName:@"" 
                  bundle:nil]; 
UINavigationController *navVc = [[UINavigationController alloc] 
            initWithRootViewController:vc]; 
+0

如果你看到分割視圖控制器,這是我想問的東西。所以它也可以用於iPhone,所以我們有一些組件有2個視圖,一個主要和另一個用於顯示另一個視圖控制器,但每個視圖都在屏幕上,所以用戶每次都能看到兩個視圖控制器的兩個視圖 –

+0

在這種情況下,你會設置多個Storyboard;一個用於iPhone,另一個用於iPad,根據每個設備創建UI。您不能在iPhone上同時顯示2個'UIViewController'實例。至少,'UIViewController'實例是全屏顯示的; – mbm29414

+0

請檢查我已經實現了我正在尋找的源https://bitbucket.org/matrosovDev/ios-manage-few-view-controllers。你能評論它嗎? –

相關問題