我正在努力将我从 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
个文件。我还需要更多文件吗?
答案 0 :(得分:1)
您需要使用Segues向前传递数据。
要使用segue将数据从当前视图控制器传递到下一个新视图控制器,首先在相关故事板中创建一个带有标识符的segue。覆盖当前视图控制器的prepareForSegue
方法。在方法内部检查您刚刚通过其标识符创建的segue。通过在向下转换视图控制器上设置属性,转换目标视图控制器并将数据传递给它。
设置segue的标识符:
可以通过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数据模型中?
这应该可以解决问题。