uitableview使用先前单元格的内容加载单元格

时间:2010-11-24 19:32:45

标签: iphone uitableview

在我的表格视图中,单元格大小适合整个屏幕大小。所以它只创建了两个单元格,但是从第三个单元格创建它使用旧单元格的内容...所以我得到的数据不正确..

如何解决这个问题......?

感谢。

   - (UITableViewCell *)tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil) 
        cell = [[[UITableViewCell alloc] initWithFrame:CellFrame reuseIdentifier:CellIdentifier] autorelease];
    for(UIView *v in [cell.contentView subviews])
        [v removeFromSuperview];

        curCellNo = indexPath.row;
        if(curCellNo == 0){
            min = 0;
            max = 8;
            x=0;
            y=yForFirst;
            col = 1;
        }else{ 
            if(curCellNo < prevCellNo){
                min = min-12;
                max = max-12;

            }else{
                min = max;
                max = min+12;
            }
            x=0;
            y=0;
        }
        prevCellNo = curCellNo;
        NSLog(@"Max...%d",max);
        NSLog(@"Min...%d",min);
        NSLog(@"songsCount...%d",[songs count]);

        for(int i=min; i<max && i<[songs count]; i++){

            Song *thesong = [self.songs objectAtIndex:i];
            CGRect frame;
            frame.size.width=coverWidth; frame.size.height=coverHeight;
            frame.origin.x=x; frame.origin.y=y;

            LazyImageView* asyncImage = [[[LazyImageView alloc] initWithFrame:frame]autorelease];
            NSURL* url = [NSURL URLWithString:thesong.cover];
            [asyncImage loadImageFromURL:url];

            UILabel *label = [[[UILabel alloc]initWithFrame:CGRectMake(x, y+artistLabelYPos, artistLabelWidth, artistLabelHeight)]autorelease];
            label.text = [thesong.title stringByAppendingString:[@"\nby " stringByAppendingString:thesong.artist]];
            [label setTextAlignment:UITextAlignmentLeft];
            label.numberOfLines = 0;
            label.font = [UIFont systemFontOfSize:artistLabelFontSize];
            label.textColor = [UIColor whiteColor];
            label.backgroundColor = [UIColor darkTextColor];
            label.alpha = 0.75;

            UIButton *playBtn = [UIButton buttonWithType:UIButtonTypeCustom];
            playBtn.frame = CGRectMake(x+playBtnXPos, y+playBtnYPos, playBtnWidth, playBtnHeight); 
            [playBtn addTarget:self action:@selector(playBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
            if(playingButton && streamer){
                if(playingButtonTag == i && [streamer isPlaying]){
                    [playBtn setBackgroundImage:[UIImage imageNamed:pauseBtnimgName] forState:UIControlStateNormal];
                    playingButton = playBtn;
                }else [playBtn setBackgroundImage:[UIImage imageNamed:playBtnimgName] forState:UIControlStateNormal];
            }else [playBtn setBackgroundImage:[UIImage imageNamed:playBtnimgName] forState:UIControlStateNormal];


            playBtn.tag = i;
            [cell.contentView addSubview:asyncImage];
            [cell.contentView addSubview:label];
            [cell.contentView addSubview:playBtn];
            label = nil;
            asyncImage = nil;



            if(curCellNo == 0){
                y += estCoverHeight;
                if(y>=(estCoverHeight*noOfRowsInCell)){
                    col++;
                    x += estCoverWidth;
                    if(col>=3)
                        y=0;
                    else 
                        y=yForFirst;
                }   
            }else{
                col =3;
                y += estCoverHeight;
                if(y>=(estCoverHeight*noOfRowsInCell)){

                    x += estCoverWidth;
                    y=0;
                }
            }

        }

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.contentView.transform = CGAffineTransformMakeRotation(M_PI/2);
    return cell; 
}

4 个答案:

答案 0 :(得分:2)

这是因为你永远不会设置重复使用的UITableViewCell的内容

您只在(cell == nil)和分配新单元格时提供conetent

答案 1 :(得分:1)

重复使用时,您不会清除单元格的内容。这是UITableView编程101.请在iTunesU上有WWDC视频,Stanford视频,如果您愿意,还可以使用文本中的tableview编程指南,这些都是关于单元重用的。

简而言之:细胞被重复使用以节省内存。您可以在离开屏幕时重复使用旧单元格,如果没有可以重复使用则分配新单元格。如果您重复使用旧单元格,则必须先清除放在它们上的所有子视图。

另外,您可能需要一个自定义单元格来执行您在tableView:cellForRowAtIndexPath:中所做的大部分工作。我强烈建议您同时查看它。

答案 2 :(得分:1)

我犯了一些错误 - 一旦你完成它并修复它,你永远不会忘记:)

出于性能原因,缓存了UITableViewCell的实例。 UITableView类为您处理这一切。它基本上缓存了足够的实例来覆盖整个屏幕的细胞和一些细胞。这意味着具有100行的表将使用与具有1000行的表相同数量的实例。

这意味着您有责任在内容出现时更新内容。

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath在请求单元格时被调用。在您的实施中:

if(cell == nil) {
    // Instantiate the UITableViewCell here
    // Perform operations that need to occur on every cell, regardless of content
} 

// Out here, perform content assignments

希望清除一些东西。你基本上只需要将条件内部的大部分代码转移到条件之外。那就是说,我不会宽恕你对代码的使用。你真的应该实现一个自定义单元格。它比你正在做的更容易:)

答案 3 :(得分:0)

试试这个

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];

它对我有用。我有一个带有组合单元格的UITableView。我也遇到了同样的问题。