Ios 从表视图控制器引用特定的表视图单元格
我有一个Ios 从表视图控制器引用特定的表视图单元格,ios,swift,uitableview,avaudioplayer,Ios,Swift,Uitableview,Avaudioplayer,我有一个UITableView,其中的单元格显示音频波形图像和播放按钮。当然,点击按钮会使音频播放。为了减少内存使用,我在表视图控制器中声明了一个AVAudioPlayer实例。我定义了一个具有playAudio(url:url)和stopPlayingAudio()方法的协议,我的表视图控制器符合该协议。每当一个新的单元出列时,我都会将表视图控制器指定为该单元的代理,这样当用户点击单元UI中的播放按钮时,它就会调用playAudio(url)delegate方法。这似乎工作得很好,但我现在遇到
UITableView
,其中的单元格显示音频波形图像和播放按钮。当然,点击按钮会使音频播放。为了减少内存使用,我在表视图控制器中声明了一个AVAudioPlayer
实例。我定义了一个具有playAudio(url:url)
和stopPlayingAudio()
方法的协议,我的表视图控制器符合该协议。每当一个新的单元出列时,我都会将表视图控制器指定为该单元的代理,这样当用户点击单元UI中的播放按钮时,它就会调用playAudio(url)
delegate方法。这似乎工作得很好,但我现在遇到了一个问题
在播放音频时,我正在计算完成百分比值,我想用这个值更新table view单元格UI,但我不确定如何从table view控制器引用正确的单元格。似乎被点击启动音频播放的单元如果滚动到屏幕外,最终可能会被回收(除非我误解了单元是如何动态退出队列的)。有什么方法可以做到这一点吗?如果您知道要查找的是表格的哪一行,可以向表格视图查询相应的单元格:
guard let cell = tableView.cellForRow(at: indexPath) as? WaveformCell {
cell.fractionComplete = ...
}
如果知道要查找的表的哪一行,可以向表视图查询相应的单元格:
guard let cell = tableView.cellForRow(at: indexPath) as? WaveformCell {
cell.fractionComplete = ...
}
你可以通过几种方式实现你想要实现的目标
AudioStateObserverProtocol
)以将此数据发送到单元,此协议可能有一种方法,可在播放器播放时定期更新单元UI(类似于,updateplayiduration:
或类似的内容),这将确保您获得资产播放量的值。因此,当用户点击播放按钮而不是调用playAudio(url:url)
时,您可以将协议方法更新为playAudio(url:url,stateObserver:tableViewCell)
,表视图控制器将设置为类型为AudioStateObserverProtocol
的委托
protocol AudioStateObserverProtocol {
func updatePlayDuration(to time: CMTime)
}
停止观察(单元格:表格视图单元格)
添加到您使用播放音频(url:url)
和停止播放音频()定义的协议中。
cellForRow
数据源方法中设置单元格时,首先调用停止观察(单元格:TableViewCell)
。在tableview控制器内实现此方法时,根据类型为AudioStateObserverProtocol
的参数检查单元格实例,如果相同,则将其设置为nil,以便此单元格不再获得更新isplay
状态,如果为真,则将单元格设置为AudioStateObserverProtoc类型的观察者ol
你可以通过几种方式实现你想要实现的目标
AudioStateObserverProtocol
)以将此数据发送到单元,此协议可能有一种方法,可在播放器播放时定期更新单元UI(类似于,updateplayiduration:
或类似的内容),这将确保您获得资产播放量的值。因此,当用户点击播放按钮而不是调用playAudio(url:url)
时,您可以将协议方法更新为playAudio(url:url,stateObserver:tableViewCell)
,表视图控制器将设置为类型为AudioStateObserverProtocol
的委托
protocol AudioStateObserverProtocol {
func updatePlayDuration(to time: CMTime)
}
停止观察(单元格:表格视图单元格)
添加到您使用播放音频(url:url)
和停止播放音频()定义的协议中。
cellForRow
数据源方法中设置单元格时,首先调用停止观察(单元格:TableViewCell)
。在tableview控制器内实现此方法时,根据类型为AudioStateObserverProtocol
的参数检查单元格实例,如果相同,则将其设置为nil,以便此单元格不再获得更新isplay
状态,如果为真,则将单元格设置为AudioStateObserverProtoc类型的观察者ol
也许这个细胞应该有一个参照物