1

我正在开发一款软件,它接受用户输入,对其进行大量计算,然后根据计算结果显示数字和图表。我认为 MVC 方法尽可能好。以下是我的问题:

  1. 我应该在哪里存储用户输入(将显示在表格视图中)?它应该存储在ArrayController控制器类中需要的还是模型(类)中的附加数组中?到目前为止我的理解是信息应该存储在模型中。

  2. 我应该在哪里进行所有必要的计算,其输出用于视图中的图形?这些应该在模型中还是在视图控制器(类)中完成?

  3. 在 nib 中为表视图设置单独的控制器类是否有意义?现在我通过ArrayController相应的窗口控制器(类)处理这些数据。

我问的是非常笼统的问题,因为我知道 MVC 方法独立于代码,但我在显示更具体的代码方面没有问题。

提前致谢。

4

3 回答 3

2

我在哪里存储应该在表格视图中显示的用户输入。它应该存储在控制器类中所需的数组控制器中还是模型(类)中的附加数组中?到目前为止我的理解是信息应该存储在模型中。

控制器类应该读取它并将其存储在模型类中。视图和模型不直接相互交流。

在哪里进行所有必要的计算,这些计算为视图中的图形获取输出。应该在模型中还是在视图控制器(类)中完成?

在控制器中,绝对。

在 nib 中为表视图设置一个单独的控制器类是否有意义?现在我通过相应的窗口控制器(类)中的数组控制器处理这些数据。

是的,这是有道理的。你也可以使用表格视图控制器——你可以拥有尽可能多的控制器,只要你觉得有用。

于 2013-01-12T19:38:58.677 回答
1

大多数 iOS 实现——包括我见过的大量教程——并不严格遵循 MVC 方法。换句话说,UIViewController子类(或UITableViewController子类)充当控制视图的对象(V)控制器本身(C)。

从技术上讲,这些控制器是视图层。

UITableView希望它的控制器成为数据源委托,这意味着它必须符合相关的数据源协议。实际上,视图控制器通常分配self为数据源委托(或 IB 分配文件的所有者,通常是视图控制器)。

要回答您的问题:

  1. 我会说数据应该在模型中表示。为了支持表格,您可以使用一些NSArrayNSDictionary结构(带有索引路径)来引用模型中的对象或包含模型中的数据副本。如果您有一个专用控制器,那么它应该将模型的数据链接到视图的数据。

  2. 所有与业务逻辑有关的计算都应该在控制器中完成。如果您决定遵循既定模式,即拥有一个同时满足这两个目的的视图控制器,那么这将是您进行计算的地方。直接影响外观的计算(颜色xy绘图值,宽度和高度值等)应始终在视图控制器中完成。

  3. 正如我之前所说,根据 MVC 模型使用(或滥用)视图控制器(窗口控制器是视图控制器)作为控制器是相当普遍的。我决定采用这种方法,以便我可以轻松地集成来自教程或 Stack Overflow 答案的代码片段。但最终,这取决于你。但是,仅当您拥有单视图应用程序时,建议使用窗口控制器。一旦你开始使用导航视图控制器来推送视图、标签栏等,你应该(ab)使用相关的UIViewController子类,如果你没有使用专用的控制器对象。

于 2013-01-12T19:40:51.557 回答
1

您可以将数据数组与计算代码一起放在一个类中:模型。然后视图控制器将读取用户输入并将其放置在此模型类中。这是一个很好的面向对象设计,将数据及其操作很好地结合在一起,同时完全没有与 UI 相关的代码。

如果计算不会花费太多时间,您可以在主线程中执行它们,以便您的视图控制器调用模型方法,该方法返回结果。或者,根据数据的形状,模型可能会通过其他方法和/或属性使结果可用。

如果计算可能需要更长时间,您应该考虑使用GCD在模型内的较低优先级线程上运行它们dispatch_async()。你不想阻止 UI 太久——我会说大约一秒钟是极限。在这种情况下,最好在模型的计算方法中添加一个就绪块,以便模型可以在计算就绪时通知视图控制器。不要忘记在主线程上运行这个块,以防止视图控制器中的 UIKit 操作被搞砸。(如果您需要我上面提到的任何内容的详细信息或代码,请告诉我,但其中大部分内容应该很容易在 Stack Overflow 或其他地方找到。)

最后,为您的 NIB 提供一个包含表视图的单一视图控制器是可行的方法。您通常会将 UI 功能(例如图形)放在UIView子视图中,而不是放在额外的UIViewController. 然后您可以将子视图放在您的 NIB 上(或以编程方式将其添加到视图控制器中)。

于 2013-01-12T20:01:38.250 回答