将Firebase中的值从一个tableView传递到另一个tableView

时间:2016-08-03 08:58:08

标签: ios swift uitableview firebase firebase-realtime-database

我正在努力将我从 Firebase 获得的价值传递给另一个tableView。我从 Firebase 获得2个值 - "品牌"和"产品"。我想尝试像汽车应用程序。如果您点击福特,则会出现新的tableView,并显示所有福特车型。这是我到目前为止所做的。

像这样我从 Firebase 获得品牌:

func parseSnusBrands(){
    let ref = FIRDatabase.database().reference().child("Snuses").child("Brands")

    ref.observeSingleEventOfType(.Value, withBlock: { (snapshot) in
        if snapshot.exists() {
            if let all = (snapshot.value?.allKeys)! as? [String]{
                for a in all{
                    if let products = snapshot.value![a] as? [[String:String]]{
                        self.snusBrandsArray.append(["key":a,"value":products])
                    }
                }
                self.snusBrandsTableView.reloadData()
            }
        }
    })
}

就像这样,我会检测到哪个单元格被点击并打印属于所点击品牌的产品:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){
    print("products at \(indexPath.row)  --> \(snusBrandsArray[indexPath.row]["value"])")

}

如何将(snusBrandsArray[indexPath.row]["value"])传递给新tableView?我尝试使用segues并寻找像"如何在viewControllers和#34之间传递价值的教程;但我运气不好现在我有2个tableViewController.swift个文件和一个tableViewCustomCell.swift个文件。我还需要更多文件吗?

3 个答案:

答案 0 :(得分:1)

您需要使用Segues向前传递数据。

要使用segue将数据从当前视图控制器传递到下一个新视图控制器,首先在相关故事板中创建一个带有标识符的segue。覆盖当前视图控制器的prepareForSegue方法。在方法内部检查您刚刚通过其标识符创建的segue。通过在向下转换视图控制器上设置属性,转换目标视图控制器并将数据传递给它。

设置segue的标识符:

enter image description here

可以通过ctrl +拖动到目标视图控制器,以编程方式或使用故事板中设置的按钮操作事件来执行Segues。 您可以在需要时使用视图控制器中的segue标识符以编程方式调用segue:

func showDetail() {
    performSegueWithIdentifier("showDetailingSegue", sender: self)
}

您可以在prepareForSegue方法的覆盖版本中配置segue有效内容。您可以在加载目标视图控制器之前设置所需的属性。

<强>夫特

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showDetailingSegue" {
        let controller = segue.destinationViewController as! DetailViewController
        controller.isDetailingEnabled = true
    }
}

DetailViewController是第二个视图控制器的名称,isDetailingEnabled是该视图控制器中的公共变量。

要扩展此模式,可以将DetailViewController上的公共方法视为伪初始值设定项,以帮助初始化任何所需的变量。这将自我记录需要在DetailViewController上设置的变量,而不必阅读它的源代码。它也是一个放置默认值的便利场所。

<强>夫特

func initVC(isDetailingEnabled: Bool) {
    self.isDetailingEnabled = isDetailingEnabled
}

答案 1 :(得分:1)

对于发送数据,首先在第二个视图控制器中声明您的变量..

  var productsValue = [[String:String]]()

和第一个视图控制器

  var valueTopass = [[String:String]]()

didSelectRowAtIndexPath中,在一个valueTopass

中取值
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    print("products at \(indexPath.row)  --> \(snusBrandsArray[indexPath.row]["value"])")
    if let products = snusBrandsArray[indexPath.row]["value"] as? [[String:String]]{
        valueTopass = products
        performSegueWithIdentifier("toProducts", sender: self)
    }
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){

    if (segue.identifier == "toProducts") {
        var viewController = segue.destinationViewController as! SnusProductsTableViewController
        viewController.productsValue = valueTopass
        print(productValues)
    }
}

答案 2 :(得分:0)

为什么不使用prepare for segue将包含firebase中所有内容的整个字典传递给新VC? 然后将dict存储在destinationVC数据模型中?

这应该可以解决问题。