ios - View 应该包含模型引用吗?

标签 ios objective-c oop design-patterns model-view-controller

假设我们有以下类:

查看

@interface ArticleView : UIView
@property IBOutlet UILabel *titleLabel;
@property IBOutlet UILabel *bodyLabel;
@end

型号

@interface Article : NSObject
@property NSString *title;
@property NSString *body;
@end

Controller

@interface ArticleViewController : UIViewController
@property Article *myArticle;
@property ArticleView *myArticleView;
- (void)displayArticle;
@end

@implementation
- (void)displayArticle {
    // OPTION 1
    myArticleView.titleLabel.text = myArticle.title;
    myArticleView.bodyLabel.text = myArticle.body;    

    // ... or ...

    // OPTION 2
    myArticleView.article = myArticle;
}
@end

选项 1

  • PRO: View 和模型彼此不耦合。
  • 缺点: Controller 需要知道模型和 View 的详细信息。

选项 2

  • PRO: Controller 代码轻巧灵活(如果 View 或模型发生变化, Controller 代码保持不变。
  • 缺点: View 和模型是耦合的,因此可重用性较差。

在选项 2 中,必须更改 ArticleView 以保存对模型的引用:

@interface ArticleView : UIView
@property IBOutlet UILabel *titleLabel;
@property IBOutlet UILabel *bodyLabel;
@property Article *article;
@end

然后可以覆盖文章 setter 以相应地更新 View ,如下所示:

- (void)setArticle:(Article *)newArticle {
    _article = newArticle;
    self.titleLabel.text = _article.title;
    self.bodyLabel.text = _article.body;
}

所以我的问题是,就 OO 和 iOS/MVC 最佳实践而言,这两个选项中的哪一个是最好的?

我确实见过两者都被使用过。我已经看到 OPTION 2 在 UITableViewCell 子类中常用。

我还读到, View 和模型应该设计为可重用且不依赖于任何东西,而 View Controller 应该是一堆中最不可重用的。

我的直觉是使用选项 1,因为我宁愿 View Controller 完成将模型绑定(bind)到 View 的肮脏工作,并让模型和 View 保持独立且彼此不知情。但是由于某些 View 被设计为只做一件事,那么将它们直接绑定(bind)到特定模型也许并不是那么糟糕。

我很想听听您对此的看法。

最佳答案

这并不总是一个非此即彼的决定。您的第一个选择是更典型的 Apple 版本的 MVC;在 iOS 中,模型和 View 通常不会直接相互对话,而 Controller 会在它们之间进行大部分协调。但是,拥有了解较大模型中特定类的自定义 View 并非没有道理。您可能拥有一个知道如何处理文章的 ArticleView,但 ArticleView 仍应从 Controller 接收它显示的任何文章,而不是直接从较大的模型获取它。

MVC 的目标之一是提高模型和 View 类的可重用性。如果你让你的 ArticleView 非常简单,这样 Controller 就必须完成解释文章的所有工作,那么你实际上可能会失去可重用性——每次你想用新的 View Controller 重用 ArticleView 时,你都必须重现为 ArticleView 解释文章的所有代码。或者,您始终使用相同的 View Controller 类来管理 ArticleView。这些都不是真正的“可重用”。

与此同时,您必须承认 Article 和 ArticleView 之间存在某种自然耦合,因为 ArticleView 旨在显示文章的所有相关详细信息,无论是直接从文章中获取还是让它们由 View Controller 设置。如果 Article 发生变化,无论 ArticleView 是否知道 Article,很有可能 ArticleView 必须改变。

因此,即使 Article 可能是一个模型类,也可以有一个了解它的 View 。您不想要的是了解较大模型并尝试从模型本身获取文章的 ArticleView。这将您可以在 ArticleView 中显示的文章限制为那些可以在 ArticleView 查找的地方找到的文章——它阻止您显示来自其他来源的文章。

关于ios - View 应该包含模型引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16516429/

相关文章:

objective-c - iOS:显示加载图像时的黑色状态栏

iPhone代码-CGPoint分配问题

oop - 如何确定哪个类应该有指定的方法

java - 在 Activity 中启动前台服务

ios - 在 Storyboard 中设置自动布局约束时,菜单中的同级对象不可用

iOS 以编程方式更改字体大小不起作用

ios - 如何在 iOS 上获得最准确的用户速度

objective-c - 捕获原始子类中的委托(delegate)方法调用

c++ - 在同一文件中混合使用 C++ 和 Objective-C 时的性能注意事项

PHP - 静态方法与实例方法