比方说,我们有以下类别:视图应该保存模型引用吗?
查看
@interface ArticleView : UIView
@property IBOutlet UILabel *titleLabel;
@property IBOutlet UILabel *bodyLabel;
@end
型号
@interface Article : NSObject
@property NSString *title;
@property NSString *body;
@end
控制器
@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
OPTION 1
- PRO:两者视图和模型不连接到彼此。
- CON:控制器需要知道,这两个模型和视图的细节。
OPTION 2
- PRO:控制器代码轻且柔性的(如果视图或模型改变,则控制器代码保持相同
- CON:的视图和模型是耦合的,因此可重用性较差
在选项2中,A rticleView将不得不改变,以保持对模型的引用:
@interface ArticleView : UIView
@property IBOutlet UILabel *titleLabel;
@property IBOutlet UILabel *bodyLabel;
@property Article *article;
@end
文章二传手然后可以覆盖相应地更新视图,就像这样:
- (void)setArticle:(Article *)newArticle {
_article = newArticle;
self.titleLabel.text = _article.title;
self.bodyLabel.text = _article.body;
}
所以我的问题是,这在OO和iOS/MVC最佳实践方面,这两个选项中的哪一个最好?
我当然看到这两个被使用。我在UITableViewCell子类中见过OPTION 2。
我也读了视图和模型的设计应是可重复使用的,而不是依靠什么而视图控制器是为了是最可重复使用的一群。
我的直觉是使用选项1,只是因为我宁愿视图控制器做结合的模式,认为肮脏的工作,让模型和视图保持独立,不知道对方。但是,由于一些观点只是为了做一件事而设计的,所以将它们直接绑定到特定的模型可能并不是那么糟糕。
我很想听听你对这个意见。
选项2更好。因为视图和模式似乎在那里有特定的工作,不需要重复使用。所以你不应该在管理员课上做他所有的混乱工作。使其灵活轻便。 – Divyu 2013-05-13 07:14:39
选项1是更好的设计。但我更经常地使用选项2,因为#1它更容易,#2更少(重复)代码,#3我不认为我会在其他地方重复使用这个类 – 2013-05-13 07:14:58
根据我的经验,带有模型引用的视图是*大量*痛苦的屁股调试/理解。当我回到使用它们的旧代码时,需要很长时间才能确定到底发生了什么。 – sapi 2013-05-13 07:15:00