0

我很难理解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仅视为参考整个表格的第一个单元格,而不是参考当前可见的单元格?

4

2 回答 2

2

您还必须明确说明附件何时不应存在:

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

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

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

于 2012-08-02T08:37:32.073 回答
2

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

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

于 2012-08-02T08:37:59.417 回答