【问题标题】:MVC pattern and model object initialization in CocoaCocoa 中的 MVC 模式和模型对象初始化
【发布时间】:2012-10-22 18:09:45
【问题描述】:

如果我使用NSArray 的实例来填充弹出按钮,那么就MVC 而言,NSArray 需要在哪里初始化?我猜它会属于模型,但是如果是这种情况,我该如何初始化数组?我是否启动一个新的实现文件来包含该数组? (显然不想使用我的应用程序委托文件,因为它属于控制器,而不是模型。)

【问题讨论】:

    标签: cocoa model-view-controller model


    【解决方案1】:

    MVC 的“模型”部分是应用存储、呈现和/或允许用户操作的数据。无论您的应用程序是在 Mac、iPhone 还是其他任何设备上运行,这在很大程度上都是一样的。 “视图”是 UI。那是用户在屏幕上实际看到的东西。控制器是介于这两者之间的部分。它负责实现应用的特定行为逻辑,以及将视图层“粘合”到模型层。

    因此,话虽如此,要在弹出按钮中显示的项目数组可能是模型的一部分,也可能不是模型的一部分。这完全取决于您正在实现的特定 UI。如果选择是在模型中表示的多个对象之间进行的,则数组的内容确实是模型的一部分,但控制器仍然可能以另一种形式将项目从模型中拉出并将它们转换为 NSArray。这也可能是一种在例如之间进行选择的方法。要执行的操作的固定列表,在这种情况下,它更恰当地是控制器层本身的一部分。

    换句话说,您的问题没有一个答案。但是,控制器至少会向 UI 提供有问题的数组,并且还可能对其内容完全负责。这完全取决于您要完成的工作。

    【讨论】:

    • 好的,所以我有一个弹出按钮,根据从按钮中选择的内容,它将驱动我的应用程序中另一个对象的输出。到目前为止,我已经在一个单独的模型文件中初始化了我的NSArray,然后将通过应用程序委托控制器调用该数组。这是执行此操作的最佳方式,还是我通过从应用程序委托中拆分数组来过度复杂化?
    • 如果没有真正的细节,仍然很难准确地说出你在做什么,但我的直觉是你做的工作比你需要的要多。可能没有理由创建一个只包含和初始化 NSArray 的类。
    【解决方案2】:

    初始化将在模型对象中进行,但初始化可能会从视图控制器调用(我希望这些只是称为控制器——没有 ModelController 类。)可能在 viewDidLoad 但实际上最适合您的地方用例需要。

    【讨论】:

    【解决方案3】:

    模型对象应该由控制器对象初始化,通常在viewDidLoad 方法中。如果一个模型对象由另一个模型对象拥有(例如,如果您的自定义模型对象有一个 NSArray 实例变量,那么您的自定义对象是父对象,NSArray 是子对象),那么该子模型对象应该在父模型对象的初始化方法中进行初始化。

    我想你的NSArray 本身就是一个模型对象,所以它应该在控制器对象的viewDidLoad 方法中初始化。

    【讨论】:

    • 所以你是说我根本不应该为单独的模型对象而烦恼?
    • 这完全取决于您的应用程序。 NSArray 的实例本身就是一个模型对象。
    【解决方案4】:

    这只是一个答案,并不一定是每个人都如何在 Objective C 中开发应用程序。

    如果我的应用具有小型数据模型或模型范围仅限于视图,我会将模型放在 AppDelegate 或 viewController 本身(如果它们的范围仅限于该视图)。

    它们将被初始化为最接近该数据在应用中有意义的位置。

    有时您会看到一个“FAT”视图控制器,它代表一个主屏幕控制器或主屏幕控制器,人们会将模型堆放在该类上。它很常见。

    但是,如果我有一个具有大型数据模型的应用程序 - 许多模型的生命周期不限于视图的生命周期 - 那么我将在我的应用程序中创建一个名为 *myAppNameHere*AppModel 的类,我将集中存储应用程序模型,并根据需要使用服务类来请求数据以填充/更新模型。

    这只是一种方法。好问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 2019-05-28
      • 1970-01-01
      • 2013-03-07
      相关资源
      最近更新 更多