从 VC1 向 VC2 传递值
passing value from VC1 to VC2
我现在正在将值从 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 中的 select 单元格中执行 Segue 到 VC2)
我不得不返回到 VC1,然后再次将单元格点击到 VC2,让 "passedValue" 显示它应该在那里的内容。
有人知道为什么会这样吗?
这与视图控制器生命周期有关。简而言之,当您执行到另一个视图控制器的 segue 时,应用程序会加载下一个视图控制器的视图,然后显示它。覆盖 prepareForSegue
时需要记住这一点。此时,下一个视图控制器的视图已经加载,并且在 table 的情况下,填充了基本上没有数据的内容。要解决您的问题,您只需告诉 table 在视图出现时重新加载。只需在新视图控制器上的 viewWillAppear
中调用 tableView.reloadData()
。 :)
这可能是由于对 Firebase 的调用是异步的(并非 100% 确定)。另外,您是从情节提要中调用 segue,所以我建议如下:
- 从情节提要中删除 segue
- 在 Firebase 的回复中,添加以下内容:
self.performSegueWithIdentifier("ToVari", sender: self)
你应该没事的。
这是由于 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(), {() -> 无效
self.navigateToNextViewController(日期)
})
转到情节提要,select viewController
,在“identity inspector'->identity->storyboardId
下 -> 给出 identifier
。这应该与上面函数中给出的相同。 (例如,给 identifier
名称与 viewController
名称相同)。
希望对您有所帮助。
只需将tableview的Method改成:
func tableView(tableView: UITableView, willSelectRowAtIndexPath
indexPath: NSIndexPath) -> NSIndexPath? { //put your code here
}
确保在执行此行后执行 segue :
self.valueToPass = date
只有这样你才能调用(Swift 3):
performSegue(withIdentifier: "ToVari", sender: Self)
我现在正在将值从 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 中的 select 单元格中执行 Segue 到 VC2)
我不得不返回到 VC1,然后再次将单元格点击到 VC2,让 "passedValue" 显示它应该在那里的内容。
有人知道为什么会这样吗?
这与视图控制器生命周期有关。简而言之,当您执行到另一个视图控制器的 segue 时,应用程序会加载下一个视图控制器的视图,然后显示它。覆盖 prepareForSegue
时需要记住这一点。此时,下一个视图控制器的视图已经加载,并且在 table 的情况下,填充了基本上没有数据的内容。要解决您的问题,您只需告诉 table 在视图出现时重新加载。只需在新视图控制器上的 viewWillAppear
中调用 tableView.reloadData()
。 :)
这可能是由于对 Firebase 的调用是异步的(并非 100% 确定)。另外,您是从情节提要中调用 segue,所以我建议如下:
- 从情节提要中删除 segue
- 在 Firebase 的回复中,添加以下内容:
self.performSegueWithIdentifier("ToVari", sender: self)
你应该没事的。
这是由于 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(), {() -> 无效 self.navigateToNextViewController(日期) })
转到情节提要,select
viewController
,在“identity inspector'->identity->storyboardId
下 -> 给出identifier
。这应该与上面函数中给出的相同。 (例如,给identifier
名称与viewController
名称相同)。
希望对您有所帮助。
只需将tableview的Method改成:
func tableView(tableView: UITableView, willSelectRowAtIndexPath
indexPath: NSIndexPath) -> NSIndexPath? { //put your code here
}
确保在执行此行后执行 segue :
self.valueToPass = date
只有这样你才能调用(Swift 3):
performSegue(withIdentifier: "ToVari", sender: Self)