【问题标题】:How best to build a model in this MVC如何最好地在这个 MVC 中构建模型
【发布时间】:2013-11-25 13:59:48
【问题描述】:

这是一个 MVC 最佳实践问题。我会解释我的设计,然后你们可以告诉我这听起来是否正确。

我有一个视图,它显示 PDF 中的文本数据,类似于 iBooks,名为 TextView.h。它有一个 UIScrollView,它使用分页来允许读者在页面中滑动。

我假设将文本加载和分解成页面的所有逻辑都应该由模型类完成。 因此,对于最佳实践,我想我创建一个模型类并让它负责 1)打开pdf 2) 有一个公共接口,视图控制器可以使用它来根据它想要的页面查询文本数据

我有一个 TextViewController.h,它是 TextView.h 的代表。 TextViewController 将负责 1)加载文本视图 2)查询模型并使用结果填充视图。例如

UILabel *label = [model getTextForPage:1];
[myView addPage:label];

3) 给 textViewController 一个委托方法,每次用户在视图中翻页时都会触发该委托方法。即视图控制器将监听视图的 didEndDecelerating 方法。发生这种情况时,viewController 可以获取新页面的文本并将其传递给视图,例如

  UILabel *label = [model getTextForPage:x];
    [myView addPage:label];

如果所有这些听起来都正确,请告诉我。谢谢!

【问题讨论】:

  • 一般来说,您的模型类不应该知道数据是如何呈现的,包括使用UILabel 对象呈现的事实。因此,拥有一个返回 UILabel 的模型方法并不是很好的关注点分离。

标签: ios iphone model-view-controller


【解决方案1】:

首先,您的声明:

我假设所有将文本加载和分解成页面的逻辑都应该由模型类完成

不正确,因为模型只保存值,所有对数据执行的处理都应该在 MVC 模式的控制器中完成。

例如,如果要添加两个数字,则必须将值保存在模型中,在控制器中执行加法过程,并在视图中显示结果。

如果您需要将文本拆分为页面,则应在控制器中完成该逻辑。

在 iOS 中,控制器和视图合并为一个视图控制器,因此无需创建另一个视图。在您的示例中,您可以创建一个视图并处理视图控制器中的逻辑,这很好,但是您不能像在getTextForPage 中那样处理模型中的数据。相反,将此逻辑移动到视图控制器中的一个可以返回文本的方法中,然后将此文本加载到视图标签中。该方法可以从模型对象中获取所需的细节。

总而言之,模型保存数据,创建页面的过程在视图控制器中完成,并将结果加载到您创建的视图中。

有关 iOS 中的 MVC 的更多详细信息,请参阅这些链接,它们应该会对您有所帮助:

http://blog.teamtreehouse.com/ios-design-patterns-model-view-controller-part-3

https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/Model-View-Controller/Model-View-Controller.html

【讨论】:

    【解决方案2】:

    模型 - 只保存值。 查看 - 您可以在屏幕上看到的所有内容。 控制器- 控制您希望视图运行的方式

    在你的情况下,

    TextView.h 是您的视图。涵盖所有显示和滚动视图和分页

    所有其余的逻辑加载和分解文本到页面打开pdf根据页面查询文本数据加载文本视图位于 TextViewController.h 下,那是您的 Controller

    您在这些页面中显示的数据就是您的模型

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2020-08-24
      • 2011-10-31
      • 2021-03-19
      相关资源
      最近更新 更多