比方說,我們有以下類別:視圖應該保存模型引用嗎?
查看
@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