2014-08-27 138 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:重新使用单元格时,应始终重置所有内容 。如果单元对象没有 具有关联的重用标识符,则不调用此方法。如果您重写此方法 ,则必须确保调用超类 实现。