配置自定义UITableViewCell

时间:2014-08-27 09:30:33

标签: ios objective-c uitableview

在我的项目中,我通过继承UITableViewCell来创建自定义单元格。当cellForRowAtIndexPath:被解雇时,我会做一些非常基本的事情,比如:

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

我不想在cellForRowAtIndexPath:中手动配置单元格属性,所以我想我会在MyCustomCell内创建一个名为configureWithModel:的方法,该方法正在填充{{1}有适当的数据。到现在为止还挺好!现在在MyCustomCell里面我有类似的东西:

cellForRowAtIndexPath:

MyCustomCell *cell = [self.tableView dequeueReusableCellWithIdentifier:[MyCustomCell identifier]]; [cell configureWithModel:model]; 我将一些数据(也是图片)分配到单元格中,因为您猜测它可能很慢而且很重,所以我想知道这是不是很好解决方案在configureWithModel:的子类中有这样的方法?更重要的是,它与MyCustomCell的关系如何?

3 个答案:

答案 0 :(得分:0)

执行此[cell configureWithModel:model];是最好的方法,因为如果您希望在2个以上的tableView中使用configureWithModel:,则可以避免代码冗余,并且单元格本身也可以控制单元级别。

答案 1 :(得分: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] 

是用户定义的下载图像的方法。

答案 2 :(得分:0)

这听起来像是单一责任原则的相当不错的用法。如果您的单元格需要与必须从服务器下载的图像绑定,那么这可能会让您感到困惑。在这种情况下,您不希望您的单元负责触发下载,因为单元格也将负责监视下载的进度。由于这些细胞是可重复使用的,因此随着细胞的重复使用,这变得更加成问题。

所以是的,在需要将数据绑定到单元格的简单情况下,单元格负责使用相关数据配置其子视图是有意义的。

关于prepareForReuse随意浏览documentation详细信息

  

讨论如果UITableViewCell对象是可重用的 - 也就是说,它有一个   重用标识符 - 在对象之前调用此方法   从UITableView方法返回   dequeueReusableCellWithIdentifier :.出于性能原因,你   应该只重置与之无关的单元格的属性   内容,例如,alpha,编辑和选择状态。桌子   tableView中的view委托:cellForRowAtIndexPath:应该总是如此   重新使用单元格时重置所有内容。如果单元格对象没有   具有关联的重用标识符,不调用此方法。如果你   重写此方法,您必须确保调用超类   实施