我现在将值从VC1传递到VC2
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if indexPath.row == 0 {
FIRDatabase.database().reference().child("Menus/Day1").observeSingleEvent(of: .value, with: {(snap) in
if let snapDict = snap.value as? Dictionary <String, AnyObject>{
let date = snapDict["mealPic"] as! String
let OrderInfo = DataService.ds.REF_ORDER
let USERUID = FIRAuth.auth()!.currentUser!.uid
let userinfo = OrderInfo.child(date).child(USERUID).child("data")
self.valueToPass = date
}
})
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if(segue.identifier == "ToVari") {
var Vari = segue.destination as! Variation
Vari.passedValue = valueToPass
}
}
和我的VC2 viewDidLoad: -
var passedValue : String!
override func viewDidLoad() {
super.viewDidLoad()
MEALDATE.text = passedValue
// Do any additional setup after loading the view.
}
它确实有效,但奇怪的是VC2中的“passedValue”最初没有显示(我选择VC1中的单元格来执行VC2)
我不得不回到VC1然后再次将单元格点击到VC2,让“passValue”显示它应该在那里。
任何人都知道为什么会这样?
答案 0 :(得分:3)
这可能是由于对Firebase的调用是异步的(不是100%肯定)。你也是从故事板上调用segue所以我建议你:
self.performSegueWithIdentifier("ToVari", sender: self)
你应该没事。
答案 1 :(得分:1)
这与视图控制器生命周期有关。简单地说,当您对另一个视图控制器执行segue时,应用程序会加载下一个视图控制器的视图,然后显示它。在覆盖prepareForSegue
时,您需要牢记这一点。此时,已经加载了下一个视图控制器的视图,并且在表的情况下,填充了基本上没有数据的内容。要解决您的问题,您只需要在视图出现时告诉表重新加载。只需在新视图控制器上调用tableView.reloadData()
中的viewWillAppear
即可。 :)
答案 2 :(得分:1)
这是由Firebase异步调用引起的。您可以关注@NickCatib解决方案或
func navigateToNextViewController(valueToPass: String) {
let variation = self.storyboard?.instantiateViewControllerWithIdentifier("Variation") as! Variation
variation.passedValue = valueToPass
self.navigationController?.pushViewController(variation, animated: true)
}
在Firebase异步中调用此函数,将您想要的值传递给
dispatch_async(dispatch_get_main_queue(),{() - &gt; Void in self.navigateToNextViewController(日期) })
转到情节提要,在viewController
- &gt;下选择identity inspector'->identity->storyboardId
。给identifier
。这应与上述功能相同。 (例如,将identifier
名称与viewController
名称相同)。
希望这会对你有所帮助。
答案 3 :(得分:1)
只需将tableview方法更改为:
func tableView(tableView: UITableView, willSelectRowAtIndexPath
indexPath: NSIndexPath) -> NSIndexPath? { //put your code here
}
答案 4 :(得分:1)
确保在执行此行后执行segue:
self.valueToPass = date
只有这样你才能调用(Swift 3):
performSegue(withIdentifier: "ToVari", sender: Self)