【问题标题】:passing value from VC1 to VC2将值从 VC1 传递到 VC2
【发布时间】:2016-10-25 12:15:00
【问题描述】:

我现在将值从 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 中的单元格执行Segue 到 VC2)

我必须回到 VC1,然后再次点击单元格到 VC2,让“passedValue”显示它应该在那里的内容。

有人知道为什么会这样吗?

【问题讨论】:

  • 我猜你的 segue 是直接从单元格到下一个 VC,你的 Firebase 调用不是异步的吗?我会将转场从 VC1 放到 VC2(而不是从 VC1 中的单元格),一旦你设置了 valueToPass,我就会执行转场(同时可能会显示一个微调器)。
  • 首先准备 Segue 方法被调用,在 didSelectRowAt 方法被调用之后。这就是为什么你第一次没有得到任何值,但是当你返回并返回时,你会得到存储在 valueToPass 变量中的前一个值
  • 你的 VC1 的 didSelectRowAt 被调用了?还是不行?

标签: ios swift firebase tableviewcell


【解决方案1】:

这可能是由于对 Firebase 的调用是异步的(不是 100% 确定)。另外,您正在从情节提要中调用 segue,因此我建议您遵循以下建议:

  • 从情节提要中删除转场
  • 在您来自 Firebase 的回复中,添加以下内容:self.performSegueWithIdentifier("ToVari", sender: self)

你应该没事的。

【讨论】:

    【解决方案2】:

    这与视图控制器的生命周期有关。简单地说,当你对另一个视图控制器执行 segue 时,应用程序会加载下一个视图控制器的视图,然后显示它。覆盖prepareForSegue 时需要牢记这一点。此时,已经加载了下一个视图控制器的视图,并且在表格的情况下,填充了基本上没有数据的内容。要解决您的问题,您只需告诉表格在视图出现时重新加载。只需在新视图控制器上的 viewWillAppear 中调用 tableView.reloadData()。 :)

    【讨论】:

    • 嗨,Jacob,我的 VC2 中只有一个普通的 UILabel 来显示传递的值。我叫什么
    • 哦,对不起,Ian,我的印象是您的 VC2 包含一个表格视图。对于普通标签,只需确保您在 viewWillAppear 中调用 myLabel.text = passedValue 而不是 viewDidLoad
    • 我的意思是雅各布,愚蠢的自动更正:(对不起
    【解决方案3】:

    这是由于 Firebase 异步调用。您可以关注@NickCatib 解决方案或

    func navigateToNextViewController(valueToPass: String) {
        let variation = self.storyboard?.instantiateViewControllerWithIdentifier("Variation") as! Variation
        variation.passedValue = valueToPass
        self.navigationController?.pushViewController(variation, animated: true)
    }
    
    1. 在 Firebase 中异步调用这个函数,将你想要的值传递给它

      dispatch_async(dispatch_get_main_queue(), {() -> 无效 self.navigateToNextViewController(日期) })

    2. 转到情节提要,选择viewController,在“identity inspector'-&gt;identity-&gt;storyboardId”下 -> 输入identifier。这应该与上述函数中给出的相同。 (例如,identifier 名称与 viewController 名称相同)。

    希望这会对你有所帮助。

    【讨论】:

      【解决方案4】:

      确保在执行此行后执行 segue:

          self.valueToPass = date
      

      只有这样你才能调用(Swift 3):

          performSegue(withIdentifier: "ToVari", sender: Self)
      

      【讨论】:

        【解决方案5】:

        只需将tableview的Method改为:

           func tableView(tableView: UITableView, willSelectRowAtIndexPath 
         indexPath: NSIndexPath) -> NSIndexPath? {    //put your code here 
        
         }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-12
          相关资源
          最近更新 更多