Iphone 自定义UITableViewCell中的NSNotification observer?

Iphone 自定义UITableViewCell中的NSNotification observer?,iphone,objective-c,ios,uitableview,Iphone,Objective C,Ios,Uitableview,我正在开发一款类似iPod的应用程序(播放、暂停等)。该应用程序具有tableView,每个单元格中都有曲目名称。我有一个MainViewController和一个UITableView自定义的UITableViewCell类。播放器控件存在于MainViewController中 我在每个单元格中都有一个播放/暂停按钮。我已成功设置了NSNotifications,以便在按下单元格中的播放按钮时发布通知,因此曲目信息将发送到MainViewController中的观察者和响应者方法,并启动播放

我正在开发一款类似iPod的应用程序(播放、暂停等)。该应用程序具有tableView,每个单元格中都有曲目名称。我有一个
MainViewController
和一个
UITableView
自定义的
UITableViewCell
类。播放器控件存在于
MainViewController

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

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

附加信息:
MainViewController
播放器中的播放/暂停按钮图像由一种方法确定,该方法每半秒触发一次,并检查
MPMoviePlayerController
playbackstate
。如果播放,播放按钮将设置播放图像。如果暂停,则设置为暂停图像。我认为,同时设置tableCell播放/暂停按钮的实现将在这里进行

编辑每当播放状态更改时(通过NSNotification),在my UITableViewController中调用此方法。(
playButton
是播放器控件中的播放/暂停按钮,而不是我试图根据播放状态更新的表格单元格中的播放/暂停按钮)


苹果开发网站上提供了一个很好的例子来说明你正在尝试做什么

所讨论的项目称为CustomTableViewCell。该项目使用计时器定期更新单元格,从您的描述中可以看出,您正在做类似的事情

当单元格的状态更改时,请执行以下操作

  • 更新单元格的状态。我假设这反映在普拉后台
  • 呼叫[手机设置需要显示]
  • 这将强制自定义单元格使用您设置的新状态重新绘制自身

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

    NSArray *visibleCells = self.tableView.visibleCells;
        for (CustomCell *cell in visibleCells) {
            [cell redisplay];
    }
    
    这将位于自定义表视图单元格中

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

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


    另外,您可以使用通常的方法委派,而不是通知。但通知也很有效,特别是当您需要多个观察者时。

    我不完全理解您的解决方案。通过使用
    setNeedsDisplay
    ,我是否需要在自定义单元格中使用
    drawRect
    方法?我在问题中添加了一些代码。对于您的解决方案,我将在哪里更改单元格播放/暂停按钮图像?@mnort我假设您的解决方案中确实有一个使用drawRect的自定义单元格。您是如何分配单元格的?我的问题有点不同,但您的“NSArray*visibleCells=self.tableView.visibleCells;”适合我。多谢各位+1每次播放状态更改时调用
    reloadData
    会很昂贵吗?
    reloadData
    仅为可见单元格重新加载数据。因此,这种方法是有效的。
    - (void)redisplay {
        [customCellView setNeedsDisplay];
    }