如何有效地使用MVC架构

时间:2012-07-13 22:40:23

标签: objective-c ios cocoa-touch model-view-controller design-patterns

我对View和View-controller的职责感到困惑。

我已阅读Apple's Doc on MVC但未说明任何回答我问题的明确示例。

我有一个简单的数据库应用程序,它从数据库中提取数据并使用UITableView显示它。

我的视图是自定义视图。它基本上是一个 UITableView的集合在UIView中彼此相邻显示,显示从数据库计算的数据。

我的视图Controller为每个UITableview实现委托。

我有一个容器视图(UIVIew),其中包含所有UITableview viewController:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:
(NSIndexPath *)indexPath
{

   UIView *containerForAllview = [tableview superview];
   //container view contains list of dataset . each of which is displayed 
   //  by it's own    respective tableview

   if(tableview = atableview){
      array = containerForAllview.getDatafortable(atableview);


    }else if(tableview = btableview){
     array = containerForAllview.getDatafortable(btableview);
    }
    /// like this for few more tables 

    // configure cells using this array
    cell.text = [array objectAtIndex:indexpath.row].name;
}

我觉得我的设计很可疑。

  1. View Controller是否需要了解我的整个视图层次结构。最初我以为我的ContainerView会抽象出所有内容。
  2. (它负责处理用户事件)tableviews的委托应该由containerView或我的viewcontroller实现。
  3. 如果我的视图处理事件,那么我的UIViews需要引用我的数据模型,这违反了MVC架构的概念。
  4. 我的容器视图是否包含列表数组以提供其tableviews,或者我应该将该逻辑移动到查看控制器,这是错误的吗?

2 个答案:

答案 0 :(得分:1)

视图控制器应负责管理其下的整个视图层次结构。这些视图只管理事件,因为它们知道事件何时发生以及通知谁。他们很少真正对此做任何事情。他们只是通知他们的事件代表(通常是他们自己的视图控制器)。

通常,只有viewControllers( controllers )直接与您的模型对话,并告诉他们需要知道的内容,并回应视图中有关UI事件的通知。

具体回复:

  1. 是的,ViewControllers意识到您需要它们是他们管理的整个层次结构。
  2. viewController处理委托方法,而不是视图。
  3. 不,他们只是告诉VC事件发生了(通过委托,而不是通过知道关于他们VC的任何事情,除了VC告诉视图(通过各种机制)调用哪些方法在哪种情况下。

答案 1 :(得分:1)

修改设计以遵循MVC架构的简单方法是为每个表创建一个单独的数据类。

你可以做一些TableA有数据源和委托名为TableAData的事情 - 它是一个完全独立的类。然后你只需要确保TableAData声明一个协议,以便TableA可以从TableAData监听委托方法并相应地修改它的显示!

MVC架构非常简单 - 让另一个类完成数据处理的所有处理。一旦此类处理数据,通知视图控制器,以便它可以更新用户界面!这可以通过代理或通知等方式完成,例如键值观察。