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

时间:2012-08-02 08:15:58

标签: objective-c ios cocoa-touch uitableview

我很难理解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像素。这导致指标大约每600px添加到内容高度。

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

if (indexPath.row == 0)

但这会产生相同的结果!

此屏幕截图应该有助于解释我在谈论的内容。

enter image description here

那么,我有什么办法可以让表格indexPath0仅作为参考整个表格的第一个单元格,而不是参考当前可见的单元格吗?

2 个答案:

答案 0 :(得分:2)

当配件在那里时,你必须明确说明:

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

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

实际上,这是一个很好的案例研究,用于理解出列表视图单元格的实际工作方式; - )。

答案 1 :(得分:2)

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

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