【问题标题】:Retrieve all child value to a label in table view cell将所有子值检索到表格视图单元格中的标签
【发布时间】:2017-07-27 12:58:28
【问题描述】:

我想将“Cake”的所有子值检索到蛋糕费率标签。
我正在尝试检索,但我无法正确安排代码,而且我是 ios 的入门级。

Firebase 结构

视图控制器

TestTableViewCell

import UIKit
class TestTableViewCell: UITableViewCell {

@IBOutlet weak var cakeImage: UIImageView!
@IBOutlet weak var cakeEngLabs: UILabel!
@IBOutlet weak var cakeUrLabs: UILabel!
@IBOutlet weak var cakeRateLabs: UILabel!

}

*TestTableViewController**

import UIKit
import Firebase

class TestTableViewController: UITableViewController {

@IBOutlet var cakeTableView: UITableView!

var ref = FIRDatabase.database().reference()


struct Cake {
  let cakeEngNames: String
  let cakeUrNames: String
  let cakeImages: UIImage
  var cakeRates: String
}


var cakes = [Cake(cakeEngNames: "almond Cake", cakeUrNames: "badam cake",     cakeImages: UIImage(named:"Maru")!, cakeRates: ""),

         Cake(cakeEngNames: "Jelly Cake", cakeUrNames: "jeli ka cake", cakeImages: UIImage(named:"spices")!, cakeRates: ""),

         Cake(cakeEngNames: "Jelly Cake", cakeUrNames: "jeli ka cake", cakeImages: UIImage(named:"spices")!, cakeRates: ""),

         Cake(cakeEngNames: "Jelly Cake", cakeUrNames: "jeli ka cake", cakeImages: UIImage(named:"spices")!, cakeRates: "")]




override func viewDidLoad() {
super.viewDidLoad()

let AlmondSnap = ref.child("Hyderabad").child("Bakery").child("Cake")
AlmondSnap.observe( .value, with: { (snapshot) in
    let almondRate = snapshot.value as! String
        self.cakes[].cakeRates = almondRate

        print("\(almondRate)")
        self.tableView.reloadData()
})
}

 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.cakes.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCell(withIdentifier: "TestTableViewCell", for: indexPath) as! TestTableViewCell

cell.cakeImage.image = self.cakes[indexPath.row].cakeImages
cell.cakeEngLabs.text = self.cakes[indexPath.row].cakeEngNames
cell.cakeUrLabs.text = self.cakes[indexPath.row].cakeUrNames
cell.cakeRateLabs.text = self.cakes[indexPath.row].cakeRates
return cell
}
}

【问题讨论】:

  • 我不太清楚你在这里问什么。当你运行你现在拥有的代码时会发生什么?你希望发生什么?
  • 我想在 Testtabnleviewcontroller 中检索 'Cake' 的所有子值到 ckae 数组,以便它可以出现在 viewcopntroller 的 cakreratelabel 中
  • 目前,您的蛋糕位于var cakes 数组中。你是说不是用四个硬编码的蛋糕填充这个数组,而是想从数据库中检索它?
  • 是的,先生退出了
  • 仅在 cakeRates 中我想从 firebase 连续填充所有蛋糕值

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


【解决方案1】:

所以基于 cmets,正如你所说,你只需要 cakename 和它的 rate 来填写表格。除此之外,那是静态的(如果不是,请使用@dstepan 建议的结构和答案).. 所以这里是你如何在 tableview 中填写你的数据。

   var cakes = [Cake]()

    override func viewDidLoad() {
        super.viewDidLoad()

        let almondSnap = ref.child("Hyderabad").child("Bakery").child("Cake")
        almondSnap.observe( .value, with: { (snapshot) in
            if snapshot.hasChildren(){
                for snap in snapshot.children {
                   // snap.key produces name of cake
                   // snap.value produces rate of cake

                    if let node = snap as? FIRDataSnapshot, let rate = node.value as? Int {
                        self.cakes.append(Cake(cakeEngNames: node.key,
                                          cakeUrNames: "badam cake",
                                          cakeImages: UIImage(named:"Maru")!,
                                          cakeRates: String(rate)))
                    }
                }
                self.cakeTableView.reloadData()
            }
        })
    } 

【讨论】:

    【解决方案2】:

    按照目前的构造,您可以访问您的Cake 节点,如下所示:

    var cakes: [Cake] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        let AlmondSnap = ref.child("Hyderabad").child("Bakery").child("Cake")
    
        AlmondSnap.observe( .value, with: { (snapshot) in
    
            for item in snapshot.children {
    
               if let cakeFromDatabase = item as? FIRDataSnapshot {
    
                    let cake = Cake()
    
                    cake.cakeRates = cakeFromDatabase.value // for "Almond_Cake" this will be 800
    
                    cakes.append(cake)
    
                }
    
            }
    
            self.tableView.reloadData()
        })
    }
    

    但是,根据我所见,您可能会从对当前方法进行一些设计更改中受益。

    你的数据库结构应该是

    dgrproject-ac0e7
    -- Hyderabad
        -- Bakery
            -- Cakes
                -- id1
                    -- name: Almond Cake
                    -- rate: 800
    

    等等。

    然后,在您的代码中,您可以执行以下操作

    var cakes: [Cake] = [] {
        didSet {
            self.tableView.reloadData()
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        let AlmondSnap = ref.child("Hyderabad").child("Bakery").child("Cake")
    
        AlmondSnap.observe( .value, with: { (snapshot) in
    
            let allCakes = []
    
            for item in snapshot.children {
    
                if let cakeFromDatabase = item as? FIRDataSnapshot {
    
                    let cake = Cake()
    
                    cake.cakeEngNames = cakeFromDatabase["name"] as? String
                    cake.cakeRates = cakeFromDatabase["rate"] as? Int
    
                    allCakes.append(cake)
    
                }
    
            }
    
            cakes = allCakes
        })
    }
    

    didSet 添加到您的cakes 数组现在将在您设置cakes 时自动刷新tableView。这会在您的完成处理程序中为 firebase 调用清理一些代码。我们还创建了一个allCakes 数组,这样我们就不会将新的Cake 对象附加到cakes 并导致表视图随着数据集的增长而重新加载数百次。

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      如果您将所有值存储在 NSMutableArray 中,请使用此

      cell.cakeRateLbl.text = “Almon Cake Rate :\(self.cakesArray[0].objectForKey(“Hyderabad”).objectAtIndex(0).objectForKey(“Bakery”).ObjectAtIndex(0).objectForKey(“Cake”).objectAtIndex(0).valueForKey(“Almon_Cake”) as! Int)\nAzna Mental Cake Rate :\(self.cakesArray[0].objectForKey(“Hyderabad”).objectAtIndex(0).objectForKey(“Bakery”).ObjectAtIndex(0).objectForKey(“Cake”).objectAtIndex(0).valueForKey(“Azna_Mental_Cake”) as! Int)\nBlack Forest Cake Rate :\(self.cakesArray[0].objectForKey(“Hyderabad”).objectAtIndex(0).objectForKey(“Bakery”).ObjectAtIndex(0).objectForKey(“Cake”).objectAtIndex(0).valueForKey(“Black_Forest_Cake”) as! Int)”
      

      或者你可以试试这个

      cell.cakeRateLbl.text = “Almon Cake Rate :\(self.cakes[indexpath.row].Almond_Cake)\nAzna Mental Cake Rate :\(self.cakes[indexpath.row].Azna_Mental_Cake)\nBlack Forest Cake Rate :\(self.cakes[indexpath.row].Black_Forest_Cake)”
      

      【讨论】:

      • 这是一个答案吗?如果是这样,你能解释一下并格式化它以便阅读吗?
      • 为了在单个标签中获取所有价格细节,我们需要获取字符串中的所有值 swift 将 AnyObject 轻松转换为字符串,例如我们需要简单地获取 Almon Cake 的价格` let almonCakePirce = "( self.cakesArray[0].objectForKey(“Hyderabad”).objectAtIndex(0).objectForKey(“Bakery”).ObjectAtIndex(0).objectForKey(“Cake”).objectAtIndex(0).valueForKey(“Azna_Mental_Cake”) 为! int)" `现在整数转换为字符串,如果我们需要向该字符串添加另一个值意味着在字符串之间添加“\n”
      • @GaneshManickam 有很多错误,请帮助我改进这些错误和警告以分离语句
      猜你喜欢
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      相关资源
      最近更新 更多