2014-10-10 76 views
0

我有一個約5個不同的自定義單元格,這是故事板設計的表格視圖。一個聰明的方式來配置表加載自定義單元格?

這些單元中的每一個都有其自己的專用子類UITableViewCell

cellForRowAtIndexPath,我出列的單元格:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.cellArray[indexPath.row] forIndexPath:indexPath]; 

現在的問題是,我想打電話給configureCell爲這些細胞。我的每個自定義單元類都聲明並實現了此方法,但問題是XCode拋出警報,除非我首先將這些單元轉換爲其各自的類,因爲就XCode而言,這些單元是UITableViewCell單元。

單獨鑄造每種細胞類型是可行的,但是詳細,有很多ifelse if行。有沒有更聰明的方法來做到這一點,也許使用一個協議來聲明一個方法configureCell

回答

2

確切地說,與一個協議。我認爲它比子類更靈活,但它取決於每個單元類的語義,並且您始終可以混合和匹配這兩種方法。

@protocol CellX 
- (void)configure:(id)data; 
@end 

@interface CellA : UITableViewCell <CellX> 
@end 

@interface CellB : UITableViewCell <CellX> 

@end 

在單元創建方法:

NSString *identifier = /* pick one for the indexPath and whatnot */ 
id<CellX> cell = (id<CellX>)[tableView dequeueReusableCellWithIdentifier:<#identifier#> 
                  forIndexPath:indexPath]; 

/* cell can be of class CellA or CellB depending on the selected identifier */ 
[cell configure:<#data#>]; 

除了可以添加到所述協議跨細胞(共享像kindstatus不管你使用任何屬性等的配置方法處理細胞)。

+0

我最終這樣做是因爲它感覺最「正確」的解決方案,並可轉移到其他類似的情況。 – 2014-10-10 13:26:41

2

提取configureCell到類BaseCell並讓所有自定義單元格繼承BaseCell。所以你可以

BaseCell *cell = (BaseCell *)[tableView dequeueReusableCellWithIdentifier:self.cellArray[indexPath.row] forIndexPath:indexPath]; 
[cell configureCell]; 
+0

感謝您的答覆調用它正確的版本。您大概建議我然後覆蓋單元格子類中的-configureCell方法(因爲它們每個都需要不同的實現)。但是在那種情況下,不會'[cell configureCell]'然後調用'BaseCell'中的實現? – 2014-10-10 13:06:49

+0

當然不是。它將調用每個'ChildCell'的實現,這就是所謂的多態,OO的一個原則。 – 2014-10-10 13:11:31

+0

但是在你的例子中,當你編寫'[cell configureCell]'時,編譯器當然不知道'BaseCell'實際上是哪個子類,那麼它如何知道要使用哪個實現呢? – 2014-10-10 13:18:23

0

協議是一個很好的解決方案,但我認爲有一個超類,所有這些自定義單元格視圖繼承是一個更好的。將「configureCell」放在超類中,並在子類中覆蓋它。

MyBaseCustomTableCellView *cell =(MyBaseCustomTableCellView*) [tableView dequeueReusableCellWithIdentifier:self.cellArray[indexPath.row] forIndexPath:indexPath]; 

而且,由於「dequeueReusableCellWithIdentifier:」創建你在故事板中定義的類型的細胞,稱「configureCell」應該「在子類」