将Firebase中的值从一个表视图传递到另一个表视图

问题描述:

我试图将我从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之间传递值”等教程,但我运气不佳。现在我有2 tableViewController.swift文件和一个tableViewCustomCell.swift文件。我需要更多文件吗?

+0

如果这个tableviews在不同的控制器中,请阅读prepareforSegue –

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

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

并在1日的ViewController

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) 
    } 
} 
+0

嘿!我有一个问题 –

您需要使用Segues来传递数据。

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

设定一个标识符用于赛格瑞:

enter image description here

塞格斯可以通过编程或通过按钮操作事件在按ctrl +拖动到目标视图控制器故事板设置来执行。 可以编程要求进行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 
} 

为什么不能通过整个字典,从火力使用赛格瑞准备所有的内容,新的VC? 然后将dict存储在destinationVC数据模型中?

这应该做的伎俩。