无法将indexpath.row整数传递给第二个视图控制器

时间:2016-10-30 00:53:12

标签: ios iphone swift segue

请查看下面的segue代码。有两个控制器。第一个控制器是一个具有变量“activeRow”的tableview,它是一个标识所选indexPath行的整数。然后,通过segue将变量“activeRow”传递给第二个视图控制器,该控制器具有显示所选indexPath行的标签。没什么复杂的。当我运行代码时,无论索引路径如何,第二个视图控制器上的标签始终显示“0”。 “0”是变量“activeRow”的初始值。但是,我在代码中插入的打印函数(见下文)显示“activeRow”的值正在根据tableview的所选indexPath行进行更改。值得注意的是:当我运行模拟器时,控制台会打印两次“segue function:”。例如,如果indexPath值为1,则将以下内容打印到控制台:“segue function:0”和“segue function:1”

无论如何,“activeRow”的值不会通过segue传递。

但是,如果我从secondViewController.labelTxt中删除“activeRow”变量并简单地给它一个字符串值:secondViewController.labelTxt =“Test”,那么字符串“Test”将传递给第二个视图控制器并通过标签显示。

有什么想法吗?

示例代码:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    activeRow = indexPath.row

    print("This is the active row selected: \(indexPath.row)")

    performSegue(withIdentifier:"sendToDetailView", sender: nil)
}


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

    if segue.identifier == "sendToDetailView" {

    let secondViewController = segue.destination as! DetailViewController

    secondViewController.labelTxt = String(activeRow)

    print("segue function: \(secondViewController.labelTxt)")

}

第二视图控制器代码

import UIKit

class DetailViewController: UIViewController {

    var labelTxt = ""

    //var activeRow = 0

    @IBOutlet var testLable: UILabel!


    override func viewDidLoad() {
        super.viewDidLoad()

       testLable.text = labelTxt

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

1 个答案:

答案 0 :(得分:1)

indexPath作为segue发件人传递,以便将其传递给segue准备中的DetailViewController。当控制器通过didSet时,将执行indexPath块。

未在prepare(for segue:中加载出口,因此通过在switch语句中使用目标的视图,我们将自动展开该值并加载视图。

<强> MasterViewController.swift

// MARK: UITableViewDelegate

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    performSegue(withIdentifier:"sendToDetailView", sender: indexPath)
}

// MARK: Navigation

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

    switch (segue.destination.view, segue.destination, sender) {
    case let (_, controller as DetailViewController, indexPath as NSIndexPath):
        controller.indexPath = indexPath
        break
    default:
        break
    }
}

<强> DetailViewController

// MARK: Outlets

@IBOutlet var testLabel: UILabel?

// MARK: Properties

var indexPath: NSIndexPath? {
    didSet {
        testLabel?.text = indexPath?.row.description
    }
}