UITableViewCell子类用UIImageView正确重用的方法

时间:2016-06-22 05:59:33

标签: ios objective-c uitableview

我有一个UITableViewCell子类。我想添加UIImageView作为子视图,但请确保正确重用,以便我不会反复添加子视图。我还想确保在prepareForReuse中删除图像。

这样做的正确方法是什么?

4 个答案:

答案 0 :(得分:3)

在自定义单元格子类中,您应该在initWithStyle:reuseIdentifier:方法中添加任何所需的视图。只要您在表视图中针对重用标识符注册了您的单元格类,那么只要需要新单元格,dequeueReusableCellWithIdentifier:forIndexPath:就会调用此初始化程序。重复使用单元格时不会调用此方法,因此不会多次添加图像视图。

您可以在单元格类的prepareForReuse方法中清除图像视图的当前图像。

答案 1 :(得分:0)

在重新使用之前清理单元格的正确方法是

-(void)prepareForReuse;

只需设置self.imageView.image = nil;

要创建UIImageView,我会做类似的事情:

- (instancetype)initWithFrame:(CGRect)frame {
   self = [super initWithFrame:frame];
    [self setup];
    return self;
}

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    [self setup];
    return self;
}

- (void)setup {
/// Create your UIImageView and set layout
}

答案 2 :(得分:0)

为了正确重用单元格,在UIViewController类的viewDidLoad中注册单元格xib,然后编写

CustomCell * cell = [tableView dequeueReusableCellWithIdentifier:@" cell_ID"];

然后在imageView inn cell中加载图像。这样可以保证重复使用单元格。

答案 3 :(得分:0)

您需要将UIImageView添加为UITableviewCell子类的属性。这样在cellForRowAtIndexPath中你只需说myCellInstance.profilePicView.image = ...

查看我的回答here,了解我如何将文本字段添加为单元格子视图。请特别注意PersonCell类中initWithStyle:reusableIdentifier:的覆盖。在故事板中没有使用原型单元,没有使用viewWithTag,就像你想要的那样。

如果Person类有个人资料照片,那么cellForRowAtIndexPath会是什么样子:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    PersonCell *cell = nil;
    cell = [tableView dequeueReusableCellWithIdentifier: @"CellWithNameAndSurname"];
    if(!cell)
    {
        cell = [[PersonCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellWithNameAndSurname"];
        cell.contentView.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent: 0.08f];
        cell.delegate = self;
    }

    //this should be outside the above if statement!
    Person *respectivePerson = _peopleArray[indexPath.row];
    cell.profilePicView.image = respectivePerson.profilePic;
    cell.nameTextField.text = respectivePerson.name;
    cell.surnameTextField.text = respectivePerson.surname;
    cell.positionLabel.text = [NSString stringWithFormat:@"%i", (int)indexPath.row];

    return cell;
}