【问题标题】:UITableView Reuse Causing Broken CellsUITableView 重用导致破碎的单元格
【发布时间】:2023-03-09 03:17:01
【问题描述】:

当滚动我的 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;
}

【问题讨论】:

  • 贴出你的代码,这样没人能帮你..

标签: iphone objective-c uitableview


【解决方案1】:

你一般使用这种代码:

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

fill cell with actual data from current row
return cell;

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

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

【讨论】:

  • 这正是我目前所做的。我将我的代码添加到我原来的问题中。
  • 在iOS6+中你不必再这样做了,如果没有可重复使用的单元格,系统会初始化并返回一个新的单元格。
  • 所以我不需要if (cell == nil)
  • “用数据填充单元格”中是否有任何背景信息?
  • 我确实使用 GCD 在另一个线程上获取了一些图像,因为在同一个线程上执行此操作会导致表格不时冻结。
【解决方案2】:

UITableView 只会在单元格所在的位置当前不在屏幕上时将单元格出列以供重复使用。所以你不必担心“混淆”。

【讨论】:

  • 好吧,因为有时当单元格进入屏幕时,它们仍在重用来自另一个单元格的数据,这意味着它们显示的信息错误。
【解决方案3】:
static NSString *cellIdentifier=@"cell";
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if(cell==nil)
    {
        cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];
    }

我认为这对你会有帮助。

【讨论】:

  • 我已经尝试过了,它修复了这个问题,但是当它加载数据时,我会暂时得到空白单元格,试图找到最佳解决方案。
【解决方案4】:

例如将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;
}

希望对你有所帮助....

【讨论】:

  • 我已经尝试过了,它修复了这个问题,但是当它加载数据时,我会暂时得到空白单元格,试图找到最佳解决方案。
  • @JoshKahane 你有这个单元格的 xib 吗??
  • 我的故事板中有一个 UITableViewController 并且有一个带有我的单元格标识符的空白单元格,但我将所有子视图添加到 UITableViewCell 子类中。
【解决方案5】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多