【问题标题】:How to restore previous state of cell when navigating back to TableViewController导航回 TableViewController 时如何恢复以前的单元格状态
【发布时间】: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


    【解决方案1】:

    恐怕我没有完全理解你的意思。 但从我的角度来看,您应该将当前音频状态的值分配给控制器。当 tableView 将重新加载时,您应该将这些值分配给正确的单元格。 希望对你有帮助。

    【讨论】:

      【解决方案2】:

      我用我最初的想法解决了我的问题,即传回正在播放的单元格,并根据单元格的状态将其更新为正在播放的状态。效果很好,但我想有更好的方法可以做到这一点,而且它似乎不太可扩展。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-10
        • 2021-05-22
        • 1970-01-01
        • 2020-11-26
        • 1970-01-01
        相关资源
        最近更新 更多