首页 > 解决方案 > 使用 prepareForSegue 在表视图之间传递索引不起作用

问题描述

我正在尝试做的事情:

当在tableViewController 1中点击一个类别时,相应的信息会显示在tableViewController 2中

我如何尝试这样做:

var index = 0在 tableViewController 1index中有一个属性。等于indexpath.row

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    index = indexPath.row
    print("Button tapped\(index)")
}

我有一个prepareForSegue传递index给 tableViewController 2。 tableViewController 2 也有一个名为var index = 0. 我正在制作subjectDetailTableViewController.index(tableViewController 2 的索引)= tableViewController 1index

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let subjectDetailTableViewController = segue.destination as? SubjectDetailsTableViewController {
        // make the indexes equal between view controllers
        subjectDetailTableViewController.index = index
    }
}

接下来,viewWillAppeartableViewController2 的方法使用新的值index来确定如何加载单元格

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Determine the subject tapped, then correspond with the correct information

    if index == 0 {
        loadAnatomy()
    } else
        if index == 1 {
            loadFormulas()
        } else
            if index == 2 {
                loadHemodynamics()
            } else
                if index == 3 {
                    loadProcedures()
                } else
                    if index == 4 {
                        loadRadiology()
    }
}

这样,如果用户点击 tableViewController1 中名为 ANATOMY 的单元格(indexPath.row编号 0),该loadAnatomy()方法将使用 ANATOMY 信息填充 tableViewController 2 的单元格

问题

它并不总是有效。似乎落后了一步。如果我点击另一个类别,即公式(这是indexPath.row数字 1),它将加载解剖。然后,如果我回到 tableViewController 1 并再次按 FORMULAS ,它会正常工作。

我以为我把 if 语句放在了错误的位置,所以我把它从viewDidLoadtableViewController 2 的方法移到了viewWillAppear方法中。但这并没有解决这个问题。

我错过了什么?先感谢您。

标签: xcodeuitableviewsegue

解决方案


我从以下位置更新了我的覆盖功能:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let subjectDetailTableViewController = segue.destination as? SubjectDetailsTableViewController {
    // make the indexes equal between view controllers
    subjectDetailTableViewController.index = index
}

}

至:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    super.prepare(for: segue, sender: sender)

    let indexPath = tableView.indexPathForSelectedRow

    let index = indexPath?.row

    if let subjectDetailTableViewController = segue.destination as? SubjectDetailsTableViewController {
        // make the indexes equal between view controllers
        subjectDetailTableViewController.index = index!
    }

    if let mainViewController = segue.destination as? MainViewController {
        // Do not animate launch when seguing back to Main Menu
        mainViewController.initialLaunch = false
    }

}

推荐阅读