UITableView 附件添加到索引 0 时添加到其他单元格

Posted

技术标签:

【中文标题】UITableView 附件添加到索引 0 时添加到其他单元格【英文标题】:UITableView accessory added to additional cells when added to index 0 【发布时间】:2012-08-02 08:15:58 【问题描述】:

我很难理解UITableView 背后的一些逻辑。我正在从MPMediaItemCollection 填充我的表作为歌曲队列。我想要实现的是在与当前播放的歌曲匹配的索引路径处有一个正在播放的指示器作为单元格的附件视图。

我最初使用以下方法进行了尝试:

if (indexPath.row == [mutArray indexOfObject:[mainViewController.musicPlayer.nowPlayingItem valueForProperty:MPMediaItemPropertyTitle]])         
    UIImageView *playButtonView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"PlayButton.png"]];
    [cell setAccessoryView:playButtonView];

这适用于正在播放的项目,它实际上总是objectAtIndex:0。但我不明白的是为什么我的表格似乎在每个组合可见单元格的高度定义一次这个索引。

让我试着更清楚地解释这一点。假设我的桌子高 600 像素,其内容高度为 1800 像素。这会导致指示器在内容高度下大约每 600 像素添加一次。

现在我的第一个想法是,根据歌曲名称判断索引的代码有问题,所以我尝试将其更改为:

if (indexPath.row == 0)

但这会产生相同的结果!

这个屏幕截图应该有助于解释我在说什么。

那么,我可以做些什么来让表格将 indexPath0 视为仅引用整个表格的第一个单元格,而不是引用当前可见的单元格?

【问题讨论】:

【参考方案1】:

您还必须明确说明配件何时应该存在:

if (indexPath.row==0) 
   UIImageView *playButtonView = [[UIImageView alloc] initWithImage:
     [UIImage imageNamed:@"PlayButton.png"]];
   [cell setAccessoryView:playButtonView];
 
else 
   [cell setAccessoryView:nil];

原因是当单元格 0 在不同的行上出列(即重用)时,它仍然有附件视图。

实际上,这是一个很好的案例研究,可以帮助您了解出列表视图单元格的实际工作原理;-)。

【讨论】:

【参考方案2】:

这就是 tableview 重用单元格的方式:当单元格滚动出屏幕时,它会被添加到重用池中,因此,一旦您将附件视图添加到单元格并且该单元格被重用 - 您会在滚动时在随机位置看到它。

您可以在-willDisplayCell:forIndexPath 中检查您的单元格索引并添加(如果未添加)、隐藏(如果存在,但不是您想要的索引)或显示(如果存在并且它是您的索引),或添加附件视图到所有单元格并根据需要显示/隐藏。

【讨论】:

以上是关于UITableView 附件添加到索引 0 时添加到其他单元格的主要内容,如果未能解决你的问题,请参考以下文章

如何为 UITableView 索引事件添加操作 - 对于每个字母

将 UIDatePicker 添加到单元格内容视图

显示复选标记附件视图移动表格内容

php facetwp索引附件并添加媒体类型数据源

如何在UICollectionView中添加HeaderView,如UITableView的tableHeaderView

在 UITableView 中的部分索引标题之间添加填充(或增加高度)