繁体   English   中英

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

[英]Swift: Passing Variable between Views not updating first time

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

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

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.

}

如果从单元格到下一个视图控制器绘制segue ,则不会调用prepareForSegue(_:sender) 尝试从视图控制器到视图控制器绘制序列。 并使用tableView(_:didSelectRowAtIndexPath:indexPath) performSegueWithIdentifier("MySegueIdentifier" sender:self)执行手动tableView(_:didSelectRowAtIndexPath:indexPath) 有关更多信息,请查看此答案

认为有时在didSelectRowAtIndexPath之前会调用prepareForSegue,您可以将该代码移至prepareForSegue。 当您在prepareForSegue中将发送方设置为Segue时,正是分流的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
        }
    }
}

您应该阅读邓肯的评论。

第一:如果您的Segue是从UITableViewCell连接的,则不要。 删除它,然后从视图控制器本身连接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

}

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

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM