Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从表视图控制器引用特定的表视图单元格_Ios_Swift_Uitableview_Avaudioplayer - Fatal编程技术网

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 = ...
}

你可以通过几种方式实现你想要实现的目标

  • 如果要维护数据源以创建单元格(如果不是,则应维护该单元格),则维护单元格的状态,这可能包括单元格url的播放百分比以及项目是否显示的状态,默认情况下为false

  • 一旦状态就位,您现在需要更新此状态,因此您必须添加创建协议(例如
    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


  • 你可以通过几种方式实现你想要实现的目标

  • 如果要维护数据源以创建单元格(如果不是,则应维护该单元格),则维护单元格的状态,这可能包括单元格url的播放百分比以及项目是否显示的状态,默认情况下为false

  • 一旦状态就位,您现在需要更新此状态,因此您必须添加创建协议(例如
    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


  • 也许这个细胞应该有一个参照物