我有一个音频播放器应用程序,它使用导航控制器在两个TableViewControllers(AudioBookViewController和TopicViewController)之间进行切换。
当用户选择一本书时,他们将被带到他们可以为该书播放的所有可用主题:
我遇到的问题是,当移回AudioBookViewController时,导航控制器的展开segue会弹出TopicViewController。这意味着当我导航回TopicViewController时,我将丢失在TopicViewController中播放的任何单元格的状态。如果用户播放主题,他们应该在返回topicViewController时看到该行仍在播放,相反,他们都会重置为非播放状态。
我使用prepareForSegue函数将两个ViewControllers相互引用,并将当前正在播放的单元格分配给我可以相互传递的selectedCell变量。我尝试将此单元格分配给viewDidAppear函数中的表格行,并且它可以工作,但在行更新到播放状态之前有0.5秒滞后。我想在视图出现之前更新状态。
我的下一个解决方案是从所选单元格中获取一个indexPath,并在tableView cellForRowAt:函数中更改该单元格的状态,但该代码看起来很复杂,我总是听说这个函数有用。内容应简洁。我觉得这不是达到我想要的最佳方式。
当您已经远离它并且在重新访问其ViewController时使用新实例重新填充这些单元格时,在tableview中为单元格还原信息的首选方法是什么?
在TopicViewController中:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: PlayableAudioCellIdentifier, for: indexPath) as! PlayableAudioCell
if let chapters = audioBook?["Chapters"] as? [AnyObject], let chapter = chapters[indexPath.row] as? AnyObject{
cell.mainTopicLabel.text = chapter["Title"] as! String + "- "
cell.subTopicLabel.text = chapter["Subtitle"] as? String
cell.chapter = chapter
cell.delegate = self
}
return cell
}
在PlayableAudioCell中:
class PlayableAudioCell: UITableViewCell {
var delegate: PlayableAudioCellDelegate?
var isPlaying: Bool = false
var chapter: AnyObject?
@IBOutlet weak var playButton: UIButton!
@IBOutlet weak var mainTopicLabel: UILabel!
@IBOutlet weak var subTopicLabel: UILabel!
@IBAction func play(_ sender: UIButton) {
delegate?.play(cell: self)
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
protocol PlayableAudioCellDelegate{
//var chapter: AnyObject? { get }
func play(cell: PlayableAudioCell)
}
答案 0 :(得分:0)
我担心我不完全明白你的意思。 但是从我的角度来看,你应该将当前音频状态的值分配给控制器。当tableView重新加载时,您应该将这些值分配给右侧单元格。 我希望它有所帮助。
答案 1 :(得分:0)
我用我最初的想法解决了我的问题,即传回正在播放的单元格,并根据单元格状态将其更新为播放状态。效果很好,但我想有一种更好的方法可以做到这一点,它看起来似乎不太可扩展。