Swift xCode 6.4 - 在第二个视图控制器中使用由表视图控制器生成的变量

Swift xCode 6.4 - using a variable generated by a tableview controller in a second view controller

我整天都在谷歌上搜索一个可能很简单的问题,但我没有答对。希望有人能帮助我。

我有一个 table 视图控制器,其中一个原型单元格包含三个自定义标签。 当我 运行 应用程序时, table 视图控制器将生成大约 150 个 table 视图单元格,内容从 csv 文件解析。

当我点击这些单元格之一时,用户将被转发到第二个视图控制器,显示他的单元格选择的一些额外信息文本。 在用户单击 tabelview 单元格的同时,变量将更新为相应的 tableview-row-number(例如,最后一个 tableview 单元格为 150。 现在我想将此变量用作第二个视图控制器中显示的文本中的参考文本。

tableview controller中的变量是"rowSelectedFromList",将通过以下代码设置:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    var rowSelectedFromList: String

    rowSelectedFromList = rowOfItems[indexPath.row].customlabel3!
    println(rowSelectedFromList)
}

"println" 只是为了检查它是否正常工作。

问题是如何在第二个视图控制器中使用变量 "rowSelectedFromList"?

感谢您的帮助,谢谢!

您需要在 prepareForSegue 中添加一些内容,并在您的第二个视图控制器中添加一个变量。所以在你的 table 视图控制器中:

var variableToPass: String!

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    variableToPass = rowOfItems[indexPath.row].customlabel3!.text
    performSegueWithIdentifier("SecondControllerSegue", sender: nil)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "SecondControllerSegue" {
        let destinationController = segue.destinationViewController as! SecondViewController
        destinationController.passedVariable = variableToPass
    } 
}

并且在您的第二个视图控制器中,您需要添加值将传递到的变量:

var passedVariable: String!

当然,您可以选择将变量替换为您希望发送的任何类型:)

您可以像这样在 prepareForSegue 中添加自定义逻辑:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let controller = segue.destinationViewController as? YourSecondController,
            indexPath = tableView.indexPathForSelectedRow() {
        controller.someVariable = rowOfItems[indexPath.row].customlabel3!
    }
}

将 YourSecondController 替换为第二个视图控制器的 class 名称。

不要忘记为您的 UITableView 创建 IBOutlet 并将其命名为 tableView

好问题,如果你想解决这个问题请按照下面的代码:

class ViewController {
     var cvDataArray = cells = NSMutableArray.new()
    func viewDidLoad() {
        super.viewDidLoad()

        cvDataArray.enumerateObjectsUsingBlock({(obj: AnyObject, idx: Int, stop: Bool) in            var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("")
            cell.textLabel.text = obj["title"]
            cells.addObject(cell)

        })
        tableView.reloadData()
    }

    func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return cells.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        return cells.objectAtIndex(indexPath.row)
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        var cell: UITableViewCell = cells.objectAtIndex(indexPath.row)
    }
}

适用于我的代码是 Phoen1xUK 和 glyuck 答案的混合体。 我将两者放在一起并最终得到了这个工作版本:

对于 FirstViewController:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "SecondControllerSegue" {
        if let indexPath = self.tableView.indexPathForSelectedRow() {
          let rowSelectedFromList = rowOfItems[indexPath.row].customlabel3
          (segue.destinationViewController as! SecondViewController).rowTransferedFromList = rowSelectedFromList
        }
    }
}

在SecondViewController中我设置变量如下:

var rowTransferedFromList: String!