0

我对视图和视图控制器的职责感到困惑。

我已经阅读了关于 MVC 的 Apple 文档,但它没有说明任何回答我的问题的明确示例。

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

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

我的视图控制器为每个 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 是否需要了解我的整个视图 Hierarchy 。最初我认为我的 ContainerView 会抽象一切。
  2. (其职责是处理用户事件)tableviews 的委托应该由 containerView 或我的 viewcontroller 实现。
  3. 如果我的视图处理事件,那么我的 UIViews 需要引用我的数据模型,这违反了 MVC 架构的概念。
  4. 我的容器视图持有列表数组来提供它的表格视图是错误的还是我应该将该逻辑移动到视图控制器?
4

2 回答 2

1

视图控制器应该负责管理其下的整个视图层次结构。视图只管理它们知道何时发生以及通知谁的事件。他们实际上很少对此做任何事情。他们只是通知他们的事件委托(通常是他们拥有的视图控制器)。

通常,只有您的 viewController(即控制器)直接与您的模型对话,并告诉视图他们需要知道什么,并响应视图有关 UI 事件的通知。

具体回应:

  1. 是的,ViewController 就像您需要它们一样了解它们管理的整个层次结构。
  2. viewController 处理委托方法,而不是视图。
  3. 不,他们只是告诉 VC 事件发生了(通过委托,而不是通过具体了解他们的 VC 的任何信息,除了 VC 已经告诉视图(通过各种机制)在哪种情况下调用哪些方法。
于 2012-07-13T22:45:04.920 回答
1

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

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

MVC 架构非常简单——让另一个类完成所有数据处理。一旦这个类处理数据,通知视图控制器,以便它可以更新用户界面!这是通过委托或通知完成的,其中包括键值观察。

于 2012-07-13T22:49:44.497 回答