2014-08-27 165 views
1

在我的項目,我通過繼承UITableViewCell創建自定義細胞。當cellForRowAtIndexPath:被激發我做的一個非常基本的東西,如:配置自定義的UITableViewCell

MyCustomCell *cell = [self.tableView dequeueReusableCellWithIdentifier:[MyCustomCell identifier]]; 

我不想在cellForRowAtIndexPath:手動配置單元格屬性,所以我想我會創建內部MyCustomCell的方法稱爲configureWithModel:這與正確填寫MyCustomCell數據。到現在爲止還挺好!現在裏面cellForRowAtIndexPath:我有類似:

MyCustomCell *cell = [self.tableView dequeueReusableCellWithIdentifier:[MyCustomCell identifier]]; 
[cell configureWithModel:model]; 

configureWithModel:我一些數據(圖像也)分配給細胞,從而你猜它可能是slow'n'heavy所以我不知道如果這是一個很好的解決方案在MyCustomCell的子類中有這樣的方法?更重要的是,它與prepareForReuse有什麼關係?

回答

0

這樣做是最好的方法,因爲如果您想在多於兩個tableView中使用configureWithModel:,您可以避免代碼冗餘,並且單元格級別控制可能與單元本身一起存在。

0

使用[cell configureWithModel:model];將會使你的代碼看起來像更有條理,但對於圖像使用下面的委託

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

例子:

- (void)tableView:(UITableView *)tableView willDisplayCell:(AlbumCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    AlbumBO *album = [self.arrAlbums objectAtIndex:indexPath.row]; 

    dispatch_async(imageQueue_, ^{ 
     UIImage *image = [self retrieveImageWithImageUrl:album.coverPhoto]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [cell.imgVwAlbum setImage:image]; 
     }); 
    }); 
} 

這裏

AlbumCell是我自定義表格單元格 AlbumBO是包含圖像對象的對象

而且

[self retrieveImageWithImageUrl:album.coverPhoto] 

是下載圖像的用戶定義的方法。

0

這聽起來像的奇異責任原則,一個相當不錯的使用。如果你的單元需要綁定必須從服務器上下載的圖像,那麼這可能會引起你的注意。在這種情況下,您不希望您的單元格負責觸發下載,因爲單元格還將負責監視下載的進度。由於這些單元可重複使用,隨着單元重新使用,這變得更加成問題。

所以,是的,在你需要將數據綁定到一個細胞一個簡單的例子是有意義的單元負責與相關數據配置其子視圖。

關於prepareForReusedocumentation細節的偶然一瞥

討論如果一個UITableViewCell對象是可重複使用的,也就是說,它有一個 重用標識符 - 該方法被調用之前的對象是 從返回UITableView方法 dequeueReusableCellWithIdentifier :.出於性能考慮,你應該 僅重置不相關的內容 ,例如阿爾法,編輯和選擇狀態的細胞的屬性。TableView中的表 視圖的委託:cellForRowAtIndexPath:重新使用單元格時,應始終重置所有內容 。如果單元對象沒有 具有關聯的重用標識符,則不調用此方法。如果您重寫此方法 ,則必須確保調用超類 實現。