【问题标题】:Prepare for segue in TableViewDelegate methods为 TableViewDelegate 方法中的 segue 做准备
【发布时间】:2020-05-18 17:29:15
【问题描述】:

[已解决]

让我解释一下我的问题;

我有一堆 Event 对象出现在 tableView 单元格中。

这些对象存储在事件数组中

var events: [Event]

我还有另一个视图控制器(DetailViewContoller),在那个视图控制器中我有一个用于从 tableview 接收事件对象的变量。

    import UIKit

class EventDetailViewController: UIViewController {


    var event: Event?

    override func viewDidLoad() {
        super.viewDidLoad()
        print(event?.name)
    }

当我点击单元格时,我想将当前事件对象传递给 DetailViewController 中的变量(如上所示)。所以我尝试了这个->

extension EventListViewcontroller:UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // Whenever cells tapped, related object needs to pass DetailViewController
    performSegue(withIdentifier: K.Segues.eventListToDetail, sender: self)

   func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      if segue.identifier == K.Segues.eventListToDetail {
          let VC = segue.destination as! EventDetailViewController
        VC.event = events[indexPath.row]
      }
  }

}

但不幸的是,在我检查 DetailViewController 中的事件变量时执行 segue 后,它显示为 nil。所以问题是,我如何将点击的事件单元格传递给其他视图控制器?

注意:我找到了这个主题How do you test UIStoryBoard segue is triggered by didSelectRow(at:),但它对我的问题没有帮助......

【问题讨论】:

  • 你的条件if segue.identifier == K.Segues.eventListToDetail {是真的吗?如果并设置 VC.event = events[indexPath.row],控制是否会进入内部?
  • 是的,这是真的,因为当我点击单元格时,它会执行 segue,但会将 event?.name 打印为“nil”:/
  • 执行 segue 并不能确认您在 prepareForSegue 中的条件是否满足,在 prepareForSegue 中放置一个断点并检查,我假设发布的代码在这里搞砸了,您确实将 prepareForsegue 作为不同的方法而不是嵌套在didSelect
  • @SandeepBhandari 我确实放置并检查了,我意识到它根本不会触发准备 segue...
  • 这是bug,修复它你的问题就解决了

标签: ios swift tableview segue


【解决方案1】:

在你的课堂上

class ViewController: EventListViewcontroller {
     var selectedIndex: IndexPath? = nil
}

并将didSelect 中的代码更改为

extension ViewController:UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // Whenever cells tapped, related object needs to pass DetailViewController
        self.selectedIndex = indexPath
        performSegue(withIdentifier: K.Segues.eventListToDetail, sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let indexPath = self. selectedIndex, segue.identifier == K.Segues.eventListToDetail {
            let VC = segue.destination as! EventDetailViewController
            VC.event = events[indexPath.row]
        }
    }
}

希望对你有帮助

【讨论】:

  • 非常感谢 Sandeep,它有效。你也给了我一个新的视角,谢谢......
  • @rutkay-karabulak:很高兴,我可以帮助你:)
猜你喜欢
  • 2014-07-25
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
相关资源
最近更新 更多