1

我正在构建一个带有类似 iPod 的控件(播放、暂停等)的应用程序。该应用程序在每个单元格中都有带有轨道名称的 tableView。我有一个MainViewControllerwith aUITableView和一个自定义UITableViewCell类。播放器控件存在于MainViewController.

每个单元格中还有一个播放/暂停按钮。我已成功设置NSNotifications为在单元格中按下播放按钮时发布通知,因此将跟踪信息发送到观察者和响应者方法,MainViewController并启动播放器控件(由 驱动MPMoviePlayerController)。

这行得通,但是一旦播放了曲目,我就无法弄清楚如何使单元格中的播放/暂停按钮“镜像”我的 iPod 控件中播放/暂停按钮的状态。我不认为NSNotification observer在每个单元格中添加 a 是正确的方法。

附加信息:播放器中的播放/暂停按钮图像MainViewController由每半秒触发一次并检查playbackstate. MPMoviePlayerController如果播放,播放器按钮设置为播放图像。如果暂停,则设置为暂停图像。我在想设置 tableCell 播放/暂停按钮的实现也会放在这里。

在我的 UITableViewController 中,只要播放状态发生变化(通过NSNotification),就会调用此方法。(playButton是播放器控件中的播放/暂停按钮,而不是我试图根据播放状态更新的表格单元格中的播放/暂停)。

- (void) updateViewForPlayerState
{
// Change playButton image depending on playback state
[playButton setImage:((moviePlayer.playbackState == MPMoviePlaybackStatePlaying) ? pauseBtnBG : playBtnBG) forState:UIControlStateNormal];

}
4

2 回答 2

2

苹果开发网站上有一个很好的例子来说明你正在尝试做的事情。

表视图套件

有问题的项目称为 CustomTableViewCell。该项目使用 Timer 定期更新单元格,从您的描述中听起来您正在做类似的事情。

当单元格的状态发生变化时,请执行以下操作。

  1. 更新单元格的状态。我假设这反映在 plabackstate
  2. 调用 [cell setNeedsDisplay]

这应该会强制自定义单元格使用您设置的新状态重新绘制自身。

This would be in your table view controller in the timer callback method

NSArray *visibleCells = self.tableView.visibleCells;
    for (CustomCell *cell in visibleCells) {
        [cell redisplay];
}

This would be in your custom table view cell

- (void)redisplay {
    [customCellView setNeedsDisplay];
}
于 2012-06-15T19:01:32.887 回答
1

Use [tableView reloadData] when your state changed and on providing a cell in cellForRowAtIndexPath: set the button according to the state of your data (i.e whether the song that cell refers to is playing or not).

Also instead of notifications you could use delegation which is the usual approach. But notifications also work especially if you need multiple observers.

于 2012-06-18T21:48:39.190 回答