对 table 视图中选择的项目使用 segue

Use segue for item selected in table view

我已经在 Whosebug 上查看了其他可能的解决方案,但不太认为它们适用于我的问题,或者简单的我不明白是更大的可能性。这就是我想要做的。我有一个表格视图,每个部分都有部分和项目。我想根据用户在表视图中所做的选择转到不同的视图控制器。我已经使用以下代码设置了一个示例,以 segues "report1Segue" 和 "report2Segue" 为例。


class ViewController: UIViewController {

    @IBOutlet weak var reportTableView: UITableView!

    let reportGroup = ["Dietary", "Weight", "Sleep", "Meditation", "Fitness"]

    let report = [["Calorie Breakdown", "Net Calories"], ["Last 3 Months"], ["Last 3 Months"],["Last 3 Months"],["Exercises by Type"]]

    func numberOfSections(in tableView: UITableView) -> Int {
        return report.count
    }

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return reportGroup[section]
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "reportSegue" {
            if let reportVC = segue.destination as? Report1ViewController, let indexPath = reportTableView.indexPathForSelectedRow {

                reportVC.dataToDisplay = report[indexPath.section][indexPath.row]
            }
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}

extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return report[section].count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = report[indexPath.section][indexPath.row]

        return cell

    }
}

extension ViewController: UITableViewDelegate {

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        performSegue(withIdentifier: "report1Segue", sender: nil)
    }

}

非常感谢任何指导。

这里似乎需要做的是 1,在你的 didSelectRowAt 中,你需要弄清楚点击的是什么,所以根据你显示单元格的方式,你需要在这里做同样的事情找出哪个单元格被窃听。然后根据该选择,您将有一个 switch case 或 if else 语句,每个语句都将调用其唯一的 performSegue,以便根据单元格选择,它会转到不同的选择。

对于你的例子,你'selection'是报告[indexPath.section][indexPath.row]

then if switch 或者 if else 如果会像

if selection == "Last 3 Months" || selection == "Net Calories" {
    performSegue(withIdentifier: "report1Segue", sender: nil)
} else if selection == "Calorie Breakdown" {
    performSegue(withIdentifier: "report2Segue", sender: nil)
}

希望这对您有所帮助。

Swift 5.2

对于 UITableView 中的固定数据,您可以这样做:

// Hard code your IndexPath references
// This will make the code easier to read in the delegate methods
enum TableIndex {
    static let calorieBreakdown =          IndexPath(row: 0, section: 0)
    static let netCalories =               IndexPath(row: 1, section: 0)
    static let weightLastThreeMonths =     IndexPath(row: 0, section: 1)
    static let sleepLastThreeMonths =      IndexPath(row: 0, section: 2)
    static let meditationLastThreeMonths = IndexPath(row: 0, section: 3)
    static let fitnessExercises =          IndexPath(row: 0, section: 4)
}


// Example - perform whatever Segues you actually need
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    switch indexPath {
    case TableIndex.calorieBreakdown:
        performSegue(withIdentifier: "report1Segue", sender: self)
    case TableIndex.weightLastThreeMonths, TableIndex.sleepLastThreeMonths:
        performSegue(withIdentifier: "report2Segue", sender: self)
    default:
        break
    }
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let indexPath = tableView.indexPathForSelectedRow else { return }
    let data = report[indexPath.section][indexPath.row]

    switch segue.identifier {
    case "report1Segue":
        if let dest = segue.destination as? Report1ViewControler {
            dest.dataToDisplay = data
        }
    case "report2Segue":
        if let dest = segue.destination as? Report2ViewControler {
            dest.dataToDisplay = data
        }
    default:
        break
    }
}