2

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

我有一个视图显示来自类似于 iBooks 的 PDF 中的文本数据,称为 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];

让我知道这一切听起来是否正确。谢谢!

4

2 回答 2

2

首先,您的声明:

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

是不正确的,因为模型只保存值,并且对数据执行的所有处理都应该在 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

于 2013-11-13T06:40:57.873 回答
1

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

在你的情况下,

TextView.h 是您的View。涵盖所有display 和 scrollView & paging

所有其余的逻辑加载并将文本分解为页面打开pdf根据页面查询文本数据加载文本视图位于TextViewController.h下,那就是你的控制器

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

于 2013-11-13T07:25:57.713 回答