2013-07-31 41 views
1

我有一個自定義的UITableViewCell類,我用它來顯示相當複雜的一組數據。在UITableViewCell中顯示覆雜數據

本質上,單元顯示一個Match對象。但是這樣做會顯示有關兩個Teams的信息,分數,已用時間等。

思考MVC和乾淨的代碼。

我應該只傳入Match對象並讓單元格完成所有工作嗎?或者更好的做法是公開單元格的不同元素(team1NameLabel,team1ScoreLabel,team2NameLabel等),並將它們全部單獨設置在UITableViewController

第一種方式,使UITableViewController清潔但後來我依靠UITableViewCell「知道」關於Match班,Team類等等......

第二種方式使得針對UITableViewController更多的工作,但然後使UITableViewCell成爲「啞巴」顯示。它所做的只是在單元內部佈置信息。它不知道它顯示的信息。

回答

1

我會遵循下列規則:

  • 細胞應該只是有網點用於顯示數據的各個位。這是一個視圖,所以它不應該包含任何邏輯。

  • 控制器應該獲得Match數據,解析並在必要時進行計算,然後填充單元格。它是一個控制器,所以這是它在MVC環境中的主要功能。

+0

非常好,我自己傾向於此。謝謝 – Fogmeister

1

IMO它是更好,更像MVC的將Match對象傳遞給您的表格視圖單元格。

你在互聯網上找到的很多代碼(如果我還記得的話,即使是蘋果的例子)也沒有這樣做。您可以在tableView:cellForRowAtIndexPath:中調用的視圖控制器中看到多次configureCell方法。

我更喜歡將模型對象傳遞給單元格,它使我的視圖控制器代碼更簡單,並且它對單元測試更簡單:當我測試我的視圖控制器時,我只驗證模型對象是否傳遞給單元格,然後在表格視圖單元格測試中,驗證標籤的測試是否設置爲預期值。有人可能會說這讓觀點了解模型,但我沒有看到任何重大問題。

1

這兩種方式都很好,但我個人會選擇第二種選擇,即表視圖暴露@property,如果有必要,網點。

但是,如果你真的想要去的第一個選擇,我會建議有傳遞到細胞中的任何對象實現了一項協議暴露出一些方法:

@protocol tableViewCellProtocol 

    -(NSString*)titleForCell; 
    -(NSString*)descriptionForCell; 

然後你就可以「通過協議「而不是客體。

[mytableCell renderObject:objectImplementingProtocol]; 

通過這種方式,您可以輕微地分離對象本身,並準備單元以便與其他對象一起使用。