使用prepareForSegue在tableviews之间传递索引不起作用

时间:2018-05-11 18:06:11

标签: xcode uitableview segue

我正在尝试做什么:

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

我是如何尝试这样做的:

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

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

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

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

接下来,tableViewController2的viewWillAppear方法使用新值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的单元格

T 他的问题:

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

我以为我在错误的位置使用了if语句,所以我将它从tableViewController 2的viewDidLoad方法移到了viewWillAppear方法。但这并没有解决这个问题。

我错过了什么?提前谢谢。

1 个答案:

答案 0 :(得分:0)

我从:

更新了覆盖功能
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
    }

}