2012-10-11 26 views
3

首先,我不知道如果控制器是正確的話。我想要達到的是這個。如何在目標C中實現多個控制器C

@interface ClubViewController : CoreDataTableViewController :NRGridViewController 
    { 

我知道在Objective-C中這是不可能的。但是有沒有辦法解決這個問題? 因爲我想使用CoreDateTableViewController和NRGridViewController。

親切的問候

燕姿 編輯

這是我的故事板層次的樣子。

-ViewController 
    -TableView 
     -View 
     -TableViewCell 

所以我有一個tableview控制器,但在這個tableview控制器上方,你會發現一個帶有三個按鈕的小視圖。當我按下按鈕1時,我想將tableview帶走,並用NRGridview控制器繪製一個gridView。但是當我按下按鈕2和3時,使用CoreDataTableViewController填充我的tableview。

我希望這解釋更多我的問題。

+0

更新了我的答案 – NSAddict

+0

我想最好是如果你製作一個新的視圖控制器,它可以在一組其他視圖控制器視圖之間切換。 您可以將視圖控制器(如表視圖控制器和網格視圖控制器)保存在一個數組中,並將其從視圖中添加/刪除。 – NSAddict

+0

你應該看看http://subjective-objective-c.blogspot.ch/2011/08/writing-high-quality-view-controller.html,它詳細地解釋了UIViewController是如何工作的,並且它鏈接到一個github項目爲VC容器。 –

回答

2

我認爲一種方法是使用容器視圖和容器視圖控制器。該容器控制器將有2個子控制器,它們是您的CoreDateTableViewController和NRGridViewController。我已經實現了這樣的東西,如果你感興趣,我可以給你看一些代碼。

修改後:在測試應用程序中,我開始使用單個視圖模板和故事板。我在視圖的頂部添加了兩個按鈕,並在視圖的下半部分添加了一個容器視圖(這是第一個控制器是ViewController類的)。然後我拖出一個新的視圖控制器,並將控件從容器視圖拖放到新的控制器,並選擇「嵌入segue」(這將調整視圖的大小與容器視圖的大小相同)。此控制器的類已更改爲我的子類ContainerController。然後,我爲容器控制器管理的2個視圖創建了2個更多的控制器(這些視圖需要在IB中將其大小設置爲「自由形式」,以便您可以將大小設置爲與容器視圖相同)。以下是ContainerController中的代碼:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.cont1 = [[FirstController alloc]initWithNibName:@"FirstView" bundle:nil]; 
    self.cont2 = [[SecondController alloc]initWithNibName:@"SecondController" bundle:nil]; 
    [self addChildViewController:self.cont1]; 
    self.currentController = self.cont1; 
    [self.view addSubview:self.cont1.view]; 
} 

-(void)switchToFirst { 
    if (self.currentController != self.cont1) { 
     [self addChildViewController:self.cont1]; 
     [self moveToNewController:self.cont1]; 
    } 
} 

-(void)switchToSecond { 
    if (self.currentController != self.cont2) { 
     [self addChildViewController:self.cont2]; 
     [self moveToNewController:self.cont2]; 
    } 
} 

-(void)moveToNewController:(id) newController { 
    [self.currentController willMoveToParentViewController:nil]; 
    [self transitionFromViewController:self.currentController toViewController:newController duration:.6 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{} 
          completion:^(BOOL finished) { 
           [self.currentController removeFromParentViewController]; 
           [newController didMoveToParentViewController:self]; 
           self.currentController = newController; 
          }]; 
} 

我在ViewController中唯一的代碼是切換視圖的2個按鈕的IBActions。這些方法只是調用在容器控制器方法:

-(IBAction)chooseFirstController:(id)sender { 
    [self.childViewControllers.lastObject switchToFirst]; 
} 

-(IBAction)chooseSecondController:(id)sender { 
    [self.childViewControllers.lastObject switchToSecond]; 
} 
+0

如果你很善良的顯示你的代碼。但是這個容器視圖控制器是否與IOS6以外的其他設備兼容? – Steaphann

+0

@StefGeelen,我已經更新了我的答案以顯示我的代碼。容器視圖控制器功能已添加到iOS 5中。 – rdelmar

+0

Oké我會查看一下!謝謝 – Steaphann

0

你在你的代碼中試圖做的是創建一個類,它是多個其他類的子類,這是不可能的。如果你真的想這樣做,看看這個問題:Inherit from two classes

如果你想創建多個實例: CoreDataTableViewController和NRGridViewController只是類,你必須實例化得到一個實際的對象。 您可以實例化例如一個NRGridViewController使用

NRGridViewController *controller=[[NRGridViewController alloc] init]; 

我希望這回答你的問題,這是有點難以理解你的問題。

+2

我認爲Stef希望有兩個分層控制器。正如你所說,很難理解他的問題。 – 2012-10-11 14:21:05

+0

我已經更新了我的答案以涵蓋這種可能性。感謝您指出了這一點。 –

+0

我已經編輯了我的問題更多的細節,希望這有助於。 – Steaphann

0
  1. 而不是採取tableViewController,採取正常的TableView(拖動並從故事板拖放到特定位置上圖)。

  2. 當按鈕1被按下使表視圖隱藏在按鈕操作方法中。並初始化網格視圖/或將網格視圖隱藏爲NO。 (所有視圖都有隱藏在ios中的屬性)

  3. 當您按下第2和第3按鈕時,將網格視圖隱藏並將set tableview隱藏等於NO。並獲取coredata並將其存儲在數組或字典中,或者可以重新加載tableview。 (最初,在按下按鈕之前2,表格視圖沒有值,所以你可以設置一個布爾屬性,當你按下按鈕2或3設置布爾值並使用布爾值重新加載你的Tabe視圖)

如果你沒有得到我的解釋我回來。