从表视图控制器引用特定的表视图单元格

时间:2018-10-02 14:58:34

标签: ios swift uitableview avaudioplayer

我有一个UITableView,带有显示音频波形图像和播放按钮的单元格。当然,轻按按钮可以播放音频。为了减少内存使用,我在表视图控制器中声明了一个AVAudioPlayer实例。我定义了一个具有playAudio(url:URL)stopPlayingAudio()方法的协议,并且我的表视图控制器符合该协议。每当新单元格出队时,我都会将表视图控制器分配为该单元格的委托,以便用户在单元格UI中点击播放按钮时,它将调用playAudio(url)委托方法。这似乎工作得很好,但我现在遇到了问题。

我正在计算音频播放时的完成百分比,我想用该值更新表格视图单元格UI,但是我不确定如何从表格视图控制器中引用正确的单元格。如果从屏幕上滚动下来的话,似乎开始播放音频的单元可能最终会被回收(除非我误解了单元如何动态出队)。有办法吗?

2 个答案:

答案 0 :(得分:2)

如果知道要查找的表的哪一行,则可以向表视图询问相应的单元格:

guard let cell = tableView.cellForRow(at: indexPath) as? WaveformCell {
    cell.fractionComplete = ...
}

答案 1 :(得分:1)

有几种方法可以实现您想要实现的目标,

  1. 如果要维护要从中创建单元格的数据源(如果不是,则应该这样做),请保持该单元格的状态,这可以包括该单元格的url播放百分比以及该项是否isPlaying,默认情况下为false。

  2. 一旦状态到位,您现在需要更新此状态,因此您将必须添加创建协议(例如AudioStateObserverProtocol)以将该数据发送到单元,该协议可能具有一种在播放器播放时定期更新单元UI的方法(类似updatePlayDuration:或类似的东西),这将确保您获得播放了多少资产的价值。因此,当用户点击播放按钮而不是调用playAudio(url:URL)时,您可以将协议方法更新为playAudio(url:URL, stateObserver: TheTableViewCell),表视图控制器会将其设置为类型AudioStateObserverProtocol的委托。

    protocol AudioStateObserverProtocol {
        func updatePlayDuration(to time: CMTime)
    }
    
  3. 将另一个协议方法stopObserving(cell: TheTableViewCell)添加到您使用playAudio(url:URL)stopPlayingAudio()定义的协议中

  4. 下一步是如何确保重复使用的单元格仍不接收/使用更新,为此,您可以确保在cellForRow数据源方法中设置单元格时您首先致电stopObserving(cell: TheTableViewCell)。在tableview控制器内实现此方法的过程中,对照类型为AudioStateObserverProtocol的参数检查单元格实例,如果相同,则将其设置为nil,以使该单元格不再获取更新。

  5. 这里要记住的一件事是,如果您的音频仍在播放,则需要确保在创建该索引的单元时它显示更新,此时您将检查数据源的isPlaying状态,如果为true,则将单元格设置为AudioStateObserverProtocol

  6. 类型的观察者