关于tableviewcell 点击时改变的各种问题,求大神,要哭了

renes 发布于 2015/01/10 21:38
阅读 7K+
收藏 0
iOS

本人是刚转iOS开发的菜鸟,在做demo的过程中遇到了一点系列问题,求大神一解疑惑。

这是简单的代码:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (_current == indexPath.row) {
        return 90;
    }
    return 50;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
    if (cell ==nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }
    // Configure the cell...
    if (_current == indexPath.row) {
        cell.textLabel.text = @"中国国足";
        CGRect rect = cell.frame;
        rect.origin.y +=20;
        UILabel *label =  [[UILabel alloc]initWithFrame:rect];
        label.text=@"hello";
        [cell addSubview:label];
         cell.contentView.backgroundColor = [UIColor redColor];
    }else {
        cell.textLabel.text = @"进球了";
    }
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    _current = indexPath.row;
    [tableView reloadData];
    
}



大概效果是这样的。


原因我自己知道,就是再cell reuse的时候,重用了之前设置的cell的格式,

if (_current == indexPath.row) {
        cell.textLabel.text = @"中国国足";
        CGRect rect = cell.frame;
        rect.origin.y +=20;
        UILabel *label =  [[UILabel alloc]initWithFrame:rect];
        label.text=@"hello";
        [cell addSubview:label];
         cell.contentView.backgroundColor = [UIColor redColor];
    }else {
        cell.textLabel.text = @"进球了";
    }

要是我再上面这段的else中remove掉上面的设颜色,和加label的操作就可以了,但是,这还是最简单的情况,当我用自定义的cell的时候,上面有很多控件,还有按钮,按钮按了可能会加一个view在下面,label的宽度和位置也可能变,那我应该怎么办,在else里面我不可能一条一条撤销原来的操作啊。机智的我又想到了,可以自定义几个不同的cell xib,根据不同的按钮又不同的cell用,但是!!,我又想到了,当不同的按钮现实的view可能会有不同组合的情况,我不可能用那么做那么多xib啊,我只能在cellforrowatindex里面做啊,机智的我又想到了,不用cell重用机制,但是作为又抱负的码农,我在想当我很多条数据,不用重用机制会很悲剧,内存消耗太大啊,怎么办啊啊。

各位大神,求解决啊~怎样兼顾好cell的重用,又能应付各种cell改变的情况呢。



加载中
0
cykk
cykk

    for (UIView *view in cell.contentView.subviews) {

        [view removeFromSuperview];

    }

if(_current == indexPath.row) {
        cell.textLabel.text = @"中国国足";
        CGRect rect = cell.frame;
        rect.origin.y +=20;
        UILabel *label =  [[UILabel alloc]initWithFrame:rect];
        label.text=@"hello";
        [cell addSubview:label];
         cell.contentView.backgroundColor = [UIColor redColor];
    }else{
        cell.textLabel.text = @"进球了";
    }

这样试试

r
renes
按你这种方法的话,只能在cell中加层透明的view覆盖整个cell,然后再这层透明的cell中添加subview,再用你那种方法移掉这个 透明层,透明层上面的东西就自然也移除了,挺好的方法的,但是感觉方法还是不够优雅啊。
r
renes
这个removeFromSuperview会移除了之前在自定义cell中的每个cell都该有的东西的啊。
返回顶部
顶部