如何在目标C中实现多个控制器

时间:2012-10-11 14:14:46

标签: objective-c ios model-view-controller core-data gridview

首先我不知道如果控制器是正确的词。我想要实现的是这个。

   @interface ClubViewController : CoreDataTableViewController :NRGridViewController
   {

我知道在目标C中这是不可能的。但是有办法解决这个问题吗? 因为我想使用CoreDateTableViewController和NRGridViewController。

亲切的问候

燕姿 的修改

这就是我的故事板层次结构的样子。

-ViewController
  -TableView
      -View
      -TableViewCell

所以我有一个tableview控制器,但在这个tableview控制器上方你会发现一个带有三个按钮的小视图。当我按下按钮1时,我想取走tableview并使用NRGridview Controller绘制gridView。但是当我按下按钮2和3时,我使用CoreDataTableViewController填充我的tableview。

我希望这更能解释我的问题。

3 个答案:

答案 0 :(得分:2)

我认为一种方法是使用容器视图,其中包含容器视图控制器。该容器控制器将有2个子控制器,它们将是您的CoreDateTableViewController和NRGridViewController。我已经实现了这样的东西,如果你有兴趣我可以给你看一些代码。

编辑后:在测试应用中,我开始使用单个视图模板和故事板。我在视图的顶部添加了两个按钮,在视图的下半部分添加了一个容器视图(第一个控制器是ViewController类)。然后我拖出一个新的视图控制器,并将控件从容器视图拖动到新控制器并选择“embed 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];
}

答案 1 :(得分:0)

您在代码中尝试做的是创建一个类,该类是多个其他类的子类,这是不可能的。如果您真的想这样做,请查看以下问题:Inherit from two classes

如果您尝试创建多个实例: CoreDataTableViewController和NRGridViewController只是类,您必须实例化以获取实际对象。 你可以实例化,例如使用

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

我希望这能回答你的问题,理解你的问题有点困难。

答案 2 :(得分:0)

  1. 不使用tableViewController,而是使用普通的TableView(从故事板拖放到视图上的特定位置)。

  2. 按下按钮1时
  3. 使表格视图隐藏在按钮操作方法中。并初始化网格视图/或将隐藏的网格视图设置为NO。 (所有视图都具有隐藏在ios中的属性)

  4. 按下第2和第3个按钮时,隐藏网格视图并将tableview隐藏设置为NO。并获取coredata并将其存储在数组或字典中,或者您可以重新加载tableview。 (最初,在按下按钮2和3之前,表视图没有值。所以你可以设置一个bool属性,当你按下按钮2或3设置bool并使用bool重新加载你的tabe视图)

  5. 如果你没有得到我的解释,请回复我。