【问题标题】:NSNotification observer in custom UITableViewCell?自定义 UITableViewCell 中的 NSNotification 观察者?
【发布时间】:2012-06-15 18:05:51
【问题描述】:

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

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

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

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

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

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

}

【问题讨论】:

    标签: iphone objective-c ios uitableview


    【解决方案1】:

    Apple 开发网站上提供了一个很好的示例,说明您正在尝试做的事情。

    TableViewSuite

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

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

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

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

    这将在您的表视图控制器中的计时器回调方法中

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

    这将在您的自定义表格视图单元格中

    - (void)redisplay {
        [customCellView setNeedsDisplay];
    }
    

    【讨论】:

    • 我不完全理解您的解决方案。通过使用setNeedsDisplay,我是否需要在我的自定义单元格中使用drawRect 方法?我在我的问题中添加了一些代码。
    • 使用您的解决方案,我将在哪里更改单元格播放/暂停按钮图像?
    • @mnort 我假设您的解决方案中确实有一个使用 drawRect 的自定义单元格。你是如何分配单元格的?
    • 我的问题有点不同,但你的“NSArray *visibleCells = self.tableView.visibleCells;”为我工作。谢谢你。 +1
    【解决方案2】:

    当您的状态发生变化并在cellForRowAtIndexPath: 中提供一个单元格时使用[tableView reloadData],根据您的数据状态设置按钮(即该单元格所指的歌曲是否正在播放)。

    您也可以使用委托来代替通知,这是通常的方法。但通知也很有效,尤其是在您需要多个观察者时。

    【讨论】:

    • 每次播放状态发生变化时调用reloadData会不会很贵?
    • reloadData 仅重新加载可见单元格的数据。所以这种方法是有效的。
    猜你喜欢
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多