Swift在视图之间传递数据

时间:2017-04-05 17:48:33

标签: ios swift uitableview

我正在使用Swift应用程序,但我遇到了一个有点奇怪的问题。我对Swift和iOS开发都很​​陌生,所以我想我可能不会这样做。

我有一个UITableView,我可以毫无问题地阅读所选单元格的内容:

override func tableView(_ tableView: UITableView, didSelectRowAt 
indexPath: IndexPath) {
    let cell = self.tableView.cellForRow(at: indexPath)
    selectedItem = (cell?.textLabel?.text)!
}

我在类的顶部设置了一个变量,如下所示:

var selectedItem: String = String()

然后我使用seque准备设置到新页面/视图并传入所选数据:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetails"
    {
        if let destinationVC = segue.destination as? ItemDetails {
            destinationVC.detailsToDisplay = selectedItem
        }
    }
}

问题在于,虽然数据确实在视图之间传递并显示在UI中,但它并不是最新的数据。例如,当我运行代码并选择项目时,第一次没有任何内容,但是如果我单击后退按钮,再次选择该项目,这次它确实出现在下一个视图中。在UI中的后续选择中,它会导航到下一个视图,但在我选择其他项目之前不会更新文本。

在我看来,它几乎就像没有像我期望和传递的那样在每个选择上设置selectedItem变量,而是在UI中的后续选择中,它被更新。

我如何让它每次传递实际正确的项目,而不是前一项或根本没有(这是第一次运行时发生的事情)。

谢谢!

2 个答案:

答案 0 :(得分:0)

在索引

的didSelectRow之前调用你的segue

更改下面的代码

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetails"
    {
        if let destinationVC = segue.destination as? ItemDetails {



let cell = tableView.cellForRowAtIndexPath(self.tableView.indexPathForSelectedRow!) as UITableViewCell

destinationVC.detailsToDisplay = (cell.textlabel?.text)!

        }
    }
}

答案 1 :(得分:0)

如果要在控制器之间传递数据,可以创建在类上方声明的全局变量。将结果存储在该全局变量中。

例如,

在ViewController类中:

var result:String!
class ViewController:UIViewController{
result = // your data }

在SecondViewController类中:

class SecondViewController:UIViewController{
var fetch = result
if(fetch != result){
print("Got the value")
}
else
{
print("Null value")
}