【问题标题】:How to use MVC architecture effectively如何有效地使用 MVC 架构
【发布时间】:2023-03-13 01:52:01
【问题描述】:

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

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

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

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

我的视图控制器为每个 UITableview 实现了委托。

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

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

【问题讨论】:

  • 对我来说听起来好像你的模型只是另一个(数据库)控制器。模型将是一个类,它保存来自数据库的一条记录。
  • 我的模型是核心数据对象
  • 比你的措辞很模糊。
  • 是的,我不想提供有关我的模型的任何具体细节,因为该接口定义得很好。我对视图和视图控制器之间的界限感到困惑
  • 但是在你写的时候,很多人会怀疑,你弄错了模型

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


【解决方案1】:

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

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

具体回复:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 2011-07-17
      • 2017-02-01
      • 1970-01-01
      • 2012-06-28
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多