Firebase数据库到UITableView单元格问题

时间:2017-08-20 16:02:57

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

我正在创建一个使用firebase数据库在一个单元格中显示两个不同子数据库的应用程序。因此,由于我的第一个子数据库被称为" Name",它将是单元格的主要文本,而第二个子数据库," ImageURL",将是字幕的文本。细胞

我无法弄清楚为什么每当我尝试将第二个子数据库放到表格视图单元格时,它都无法正常工作。我要么得到索引超出范围错误,要么第二个子数据库甚至不显示。

这是我的代码:

变量:

@IBOutlet weak var myTextField: UITextField!
@IBOutlet weak var myNameField: UITextField!
@IBOutlet weak var myTableView: UITableView!

var ref: DatabaseReference!
var myNameList:[String] = []
var myList:[String] = []
var handle:DatabaseHandle!
var nameHandle: DatabaseHandle!

按下SAVE按钮时的按钮代码:

@IBAction func saveBtn(_ sender: Any) {

    if myNameField.text != "" {
        ref?.child("Name").childByAutoId().setValue(myNameField.text)
        myNameField.text = ""

    if myTextField.text != "" {
            ref?.child("ImageURL").childByAutoId().setValue(myTextField.text)
            myTextField.text = ""
        }
    }

}

TableView函数NumberOfRowsInSection代码:

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

TableView函数CellForRowAtIndexPath代码:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cell")
    cell.textLabel?.text = myNameList[indexPath.row]
    cell.detailTextLabel?.text = myList[indexPath.row]

ViewDidLoad代码:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    ref = Database.database().reference()
    handle = ref?.child("ImageURL").observe(.childAdded, with:{ (DataSnapshot) in
        if let item = DataSnapshot.value as? String{
            self.myList.append(item)
            self.myTableView.reloadData()
        }
    })
    nameHandle = ref?.child("Name").observe(.childAdded, with:{ (DataSnapshot) in
        if let nameItem = DataSnapshot.value as? String{
            self.myList.append(nameItem)
            self.myTableView.reloadData()
        }
    })


}

My Main.Storyboard:

enter image description here

1 个答案:

答案 0 :(得分:1)

我注意到可能导致此问题的一些事情。

cellForRowAt函数中,您使用名为textLabel的数组填充myNameList,并使用名为detailTextLabel的数组填充myList。但是,当您在viewDidLoad中加载数据时,您将两个内容都附加到myList。可能是复制/粘贴错误,但我认为其中一个应该是myNameList

此外,您的数据结构存在缺陷。在cellForRowAtIndexPath中,根据您对行进行索引的方式(使用indexPath.row),您假设项目将始终成对出现,并且两个引用将始终具有相同数量的子项。但基于saveBtn,我可以轻松输入name而不是imageURL,它只会保存name,现在整个数据库都不匹配。我建议让一个名为items的孩子参考,其中每个孩子都有nameimageURL