Swift:在视图之间传递变量而不是第一次更新

时间:2016-01-29 21:31:09

标签: ios swift uitableview

我有一个包含细胞数据的tableview。单击单元格时,它会将我带到另一个视图控制器,并在新的ViewController上的UIlabel中显示单元格标签。

但是,当我返回到tableview并选择其他单元格时,新视图控制器上的值不会立即更新。它显示最后一次单击的单元格,然后如果我返回并再次重复该过程,它将更新。

didSelectRowAtIndexPath方法

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let currentCell = tableView.cellForRowAtIndexPath(indexPath)! as UITableViewCell

    self.labeltosend = currentCell.textLabel!.text!
}

prepareForSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == PostSegueIdentifier {
        if let destination = segue.destinationViewController as? NewViewController {
            destination.newlabel = labeltosend
        }
    }
}

我应该以某种方式重新加载数据吗?

编辑1:目标视图控制器

@IBOutlet weak var dispLabel: UILabel!
var newlabel = String()

override func viewWillAppear(animated: Bool) {
    dispLabel.text = newlabel
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do view setup here.

}

3 个答案:

答案 0 :(得分:2)

如果从单元格向下一个视图控制器绘制prepareForSegue(_:sender),则不会调用{p> segue。尝试从视图控制器绘制segue以查看控制器。并使用performSegueWithIdentifier("MySegueIdentifier" sender:self)中的tableView(_:didSelectRowAtIndexPath:indexPath)执行手动分段。有关详细信息,请查看此answer

答案 1 :(得分:1)

认为prepareForSegue有时会在didSelectRowAtIndexPath之前被调用,您可以将该代码移动到prepareForSegue。当你设置一个segue,因为你在prepareForSegue中有发送者是行点击的indexPath,正好让你可以做这些事情。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == PostSegueIdentifier {
        if let destination = segue.destinationViewController as? NewViewController {
            let indexPath = sender as NSIndexPath
            let currentCell = tableView.cellForRowAtIndexPath(indexPath)! as UITableViewCell

            self.labeltosend = currentCell.textLabel!.text!
            destination.newlabel = labeltosend
        }
    }
}

你应该阅读Duncan的评论。

答案 2 :(得分:1)

首先:如果您从UITableViewCell连接了segue,请不要。删除它并从视图控制器本身连接segue。

第二:在didSelectRowAtIndexPath方法上,调用prepareForSegue方法。

最后在目标控制器上:

@IBOutlet weak var dispLabel: UILabel!
var newlabel = String()

override func viewWillAppear(animated: Bool) {
    //dispLabel.text = newlabel
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do view setup here.
    dispLabel.text = newlabel

}

此外,您需要改进命名约定。真是令人困惑

希望这有帮助!