如何在导航回TableViewController时恢复以前的单元格状态

时间:2017-01-26 16:29:26

标签: ios swift uitableview uinavigationcontroller

我有一个音频播放器应用程序,它使用导航控制器在两个TableViewControllers(AudioBookViewController和TopicViewController)之间进行切换。

Storyboard 当用户选择一本书时,他们将被带到他们可以为该书播放的所有可用主题:

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)
}

2 个答案:

答案 0 :(得分:0)

我担心我不完全明白你的意思。 但是从我的角度来看,你应该将当前音频状态的值分配给控制器。当tableView重新加载时,您应该将这些值分配给右侧单元格。 我希望它有所帮助。

答案 1 :(得分:0)

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