2016-01-29 47 views
0

我有一个tableview与单元格数据。当我单击单元格时,它会将我带到另一个视图控制器,并在新的ViewController上的UIlabel中显示单元格标签。Swift:在视图之间传递变量不是第一次更新

但是,当我回到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. 

} 
+0

什么是PostSegueIdentifier? – beyowulf

+0

一个带有segue标识符名称的变量 – JamesG

+0

我认为创建了您控制的segue--从表视图拖动到其他视图控制器? – beyowulf

回答

2

prepareForSegue(_:sender)如果从电池吸取segue下一个视图控制器不叫。尝试从视图控制器中绘制segue以查看控制器。然后使用performSegueWithIdentifier("MySegueIdentifier" sender:self)tableView(_:didSelectRowAtIndexPath:indexPath)中执行手动循环。欲了解更多信息,请看这answer

1

认为prepareForSegue有时会在didSelectRowAtIndexPath之前调用,您可以将该代码移动到prepareForSegue。当你在发送者中设置了一个segue时,prepareForSegue就是row tap的索引路径,所以你可以做这些事情。

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 
     } 
    } 
} 

您应该读邓肯的评论。

1

首先:如果你有你的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 

} 

此外,你需要提高你的命名约定。真的很困惑

希望这有助于!