UITableViewCell自定义子视图

时间:2014-02-20 00:46:50

标签: ios objective-c cocoa-touch uitableview subview

我在控制器中有这个:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"PostCell";

    PostCell *postCell = (PostCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...
    Post *post = self.displayPosts[indexPath.row];
    [postCell setPost:post];

    return postCell;
}

使用[postCell setPost:post];我发送我要使用的自定义单元格模型。

- (void)setPost:(Post *)newPost
{
    if (_post != newPost) {
        _post = newPost;
    }
    [self setNeedsDisplay];
}

现在这是我的版本,但我想改变它。现在我[self setNeedsDisplay]调用了drawRect - 我想使用subviews并且不知道如何启动它。

我在哪里添加subviews,如果使用IBOutlets,我在哪里根据该_post设置子视图值(imageviews图片,labels文字等...)? ?

或者,如果更容易指出如何使用drawRect将buttons添加到我的单元格以及如何检测touch内的图像和按钮上的drawRect?这样我就不需要改变当前的版本。

2 个答案:

答案 0 :(得分:1)

- (void)setPost:(Post *)newPost
{
    if (_post != newPost) {
        _post = newPost;
    }

    [self layoutSubviews];
    [self refreshContent];
}

- (void)layoutSubviews
{
    [super layoutSubviews];

    if (self.titleLabel == nil) {
     self.titleLabel = [[UILabel alloc] init];
     [self addSubview:self.titleLabel];
    }

    if (self.imageView == nil) {
     self.imageView = [[UIImageView alloc] init];
     [self addSubview:self.imageView];
    }

    // here I also set frames of label and imageview

}

- (void)refreshContent
{
    [self.titleLabel setText:_post.title];
    [self.imageView setImage:self.post.image];
}

这就是我完成它的方式,它在UITableView没有任何滞后的情况下运行良好。

答案 1 :(得分:0)

- (void)setPost:(Post *)newPost
{
    if (_post != newPost) {
        _post = newPost;
    }
    //check subviews exist and set value by newPost, if need no view, add subview, if need value, set new value
    //Following code is just sample.
    if(!self.imageView){
       self.imageView = [[UIImageView alloc] init];
       [self.contentView addSubview:self.imageView];
    }

    if(newImage){
        self.imageView = newImage;
    }

    [self setNeedsDisplay];
}