【发布时间】:2017-01-26 16:29:25
【问题描述】:
我有一个音频播放器应用,它使用导航控制器在两个 TableViewController(AudioBookViewController 和 TopicViewController)之间切换。
当用户选择一本书时,他们会被带到他们可以为该书播放的所有可用主题:
我遇到的问题是导航控制器的展开转场在移回 AudioBookViewController 时会弹出 TopicViewController。这意味着当导航回 TopicViewController 时,我会丢失在 TopicViewController 中播放的任何单元格的状态。如果用户播放一个主题,当他们回到 topicViewController 时,他们应该看到该行仍在播放,相反,它们都重置为非播放状态。
我使用 prepareForSegue 函数将两个 ViewController 相互引用,并将当前播放的单元格分配给可以相互传递的 selectedCell 变量。我尝试简单地将这个单元格分配给 viewDidAppear 函数中的表格行,它可以工作,但是在行更新到播放状态之前有 0.5 秒的延迟。我希望在视图出现之前更新状态。
我的下一个解决方案是从所选单元格中获取一个 indexPath,并在 tableView cellForRowAt: 函数中更改该单元格的状态,但是该代码看起来很复杂,我一直听说该函数的内容应该简单而干净.我觉得这不是实现我想要的最佳方式。
当您已经离开表格视图的单元格并且在重新访问其 ViewController 时这些单元格被重新填充新实例时,将信息恢复到表格视图中的单元格的首选方法是什么?
在 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)
}
【问题讨论】:
标签: ios swift uitableview uinavigationcontroller