【问题标题】:Swift: Passing Variable between Views not updating first timeSwift:在第一次不更新的视图之间传递变量
【发布时间】:2016-01-30 12:54:02
【问题描述】:

我有一个包含单元格数据的表格视图。当我单击单元格时,它会将我带到另一个视图控制器并在新 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.

}

【问题讨论】:

  • 什么是 PostSegueIdentifier?
  • 具有 segue 标识符名称的变量
  • 我假设创建了你从表视图控制拖动到另一个视图控制器的 segue?
  • 是的,然后选择了标识符名称(PostSegueIdentifier)
  • 如何回到第一个视图控制器?它是一种什么样的segue?通常,当您返回视图控制器时,该视图控制器会被释放。所以很奇怪,它会显示一个之前已经传递给它的值,因为它应该刚刚被实例化。这是 DestinationViewController 类的全部内容吗?

标签: ios swift uitableview


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    认为 prepareForSegue 有时会在 didSelectRowAtIndexPath 之前被调用,您可以将该代码移动到 prepareForSegue。当您在 prepareForSegue 中设置一个 segue 时,您有 sender 是 row tap 的 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
            }
        }
    }
    

    你应该阅读邓肯的评论。

    【讨论】:

      【解决方案3】:

      首先:如果您从 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
      
      }
      

      此外,您需要改进命名约定。真的很迷茫

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-24
        • 2012-07-19
        相关资源
        最近更新 更多