UITableView重用导致破碎的细胞

时间:2012-12-21 09:48:23

标签: iphone objective-c uitableview

滚动我的UITableView时(往往是我快速滚动),我的单元格的数据会混淆,因此标签可能会重复等等。

我明白重复使用单元格可能会导致这种情况,但是如果用户真的很快地向下滚动列表并且所有单元格混淆了怎么办,我该如何避免这种情况?

感谢。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"VideoListCell";
    VideoListCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[VideoListCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    if (isPlaylistView)
    {
        //Fill cell with data
    }
    else if (isPlaylistDetailView || isSearchResultsView)
    {
        //Fill cell with data
    }
    else
    {
        //Playlist button and uploads
        if (indexPath.section == 0)
        {
            //Fill cell with data
        }
        else
        {
            //Fill cell with data
        }
    }

    return cell;
}

5 个答案:

答案 0 :(得分:2)

您通常使用此类代码:

cell = dequeReusableCell;
if (cell == nil) { 
    create cell;
    initialize cell;
}

fill cell with actual data from current row
return cell;

如果您将代码“将当前行的实际数据填充单元格”移动到“if” - 您将获得您现在获得的行为。

所以答案将是“在初始化之后用”if(cell == nil)“块之外的数据填充单元格。

答案 1 :(得分:0)

如果单元格所在的位置当前处于屏幕外,

UITableView将只会将单元格出列以便重复使用。所以你不必担心“混淆”。

答案 2 :(得分:0)

static NSString *cellIdentifier=@"cell";
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if(cell==nil)
    {
        cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];
    }

我认为这会对你有所帮助。

答案 3 :(得分:0)

dequeueReusableCellWithIdentifier设置为nil,例如..

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];

<强>更新

请参阅此示例...我在单元格中加载了许多数据以及我的自定义Gridview ...

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

    UITableViewCell *gridCell = [tableView dequeueReusableCellWithIdentifier:nil];

    if(gridCell == nil)        
    {
        gridCell =  [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];


    }
    return gridCell;
}
希望这对你有帮助....

答案 4 :(得分:0)

在自定义单元格类中重写prepareForReuse方法。在此方法中,将标签的文本设置为nil,并将imageview的图像设置为nil。每次重复使用单元格时都会调用此函数,因此您的问题将得到解决。可能是这样的

- (void)prepareForReuse{
    [super prepareForReuse];
    self.titleLabel.text = nil;
    self.unitImageView.image = nil;
}