【问题标题】:Trouble loading data into Tableview from firebase无法从 firebase 将数据加载到 Tableview
【发布时间】:2018-03-13 11:26:19
【问题描述】:

将我的数据从 firebase 数据库加载到我的 tableview 时出现问题。

我有以下。 UItableview 控制器、CollegeDetailVC(它作为一个表单来填充 tableview 控制器)、单个“Offer”的单个模型,以及作为 tableviews 自定义单元格的 OfferCell

基本上我想填写一个表格,将该表格的数据发送到 Firebase,然后使用来自特定用户的所述数据重新加载 tableview。我在打印语句中接收数据,但在我的表格视图中没有任何内容。对不起,如果这一切都是微不足道的,但我已经被困了一段时间,任何建议都将不胜感激。提前为愚蠢的错误道歉,如果这可以更清楚,请告诉我。谢谢!!

Model - Offer.swift

class Offer: NSObject {

var college : String?
var headCoach: String?
var email: String?
var skype: String?
var notes: String?
var state: String?
var uniqueId: String?

}

TableView Controller.. 包含某个用户的报价列表

 import UIKit
 import Firebase

 class MyOffersVC: UITableViewController{


var offers = [Offer]()



override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    loadData()
}

// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

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


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier: "OfferCell", for: indexPath) as? MyOfferCell
        cell?.titleLabel.text = offers[indexPath.row].college
        cell?.subtitleLabel.text = offers[indexPath.row].headCoach


    return cell!


}

//to get it back to contact form!. in here we need to load all info for selected row into the detailVC
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let detailVC = self.storyboard!.instantiateViewController(withIdentifier: "CollegeDetailVC") as! CollegeDetailVC
    detailVC.offer = offers[indexPath.row]
    self.navigationController?.pushViewController(detailVC, animated: true)
}





@IBAction func newItemPressed(_ sender: UIBarButtonItem) {



}



func loadData() {
    self.offers.removeAll()
    let uid = Auth.auth().currentUser?.uid

    let ref = Database.database().reference()
    ref.child("Users").child(uid!).child("MyOffers").observeSingleEvent(of: .value) { (snapshot) in
        if let offerDict = snapshot.value as? [String:AnyObject] {
            for (_,offerElement) in offerDict {
                print(offerElement)
                let offer = Offer()
                offer.college = offerElement["college"] as? String
                offer.headCoach = offerElement["Headcoach"] as? String
                offer.email = offerElement["Email"] as? String
                self.offers.append(offer)
                print(offer)
                DispatchQueue.main.async {
                     self.tableView.reloadData()
                }
            }

        }




    } 




}

 }

Form 样式 VC

CollegeDetailVC

import UIKit
import Firebase

class CollegeDetailVC: UIViewController, UIPickerViewDelegate, 
UIPickerViewDataSource {


@IBOutlet weak var collegeField: UITextField!
@IBOutlet weak var headCoachField: UITextField!
@IBOutlet weak var emailField: UITextField!
@IBOutlet weak var skypeField: UITextField!
@IBOutlet weak var notesField: UITextView!
@IBOutlet weak var statePicker: UIPickerView!

var details : MyOfferCell!

var offer: Offer?
let statesArray = ["Alabama","Alaska","Arizona", "Arkansas", "California", "Colorado","Connecticut","Delaware", "Georgia", "Florida", "Hawaii","Idaho", "Illinios", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"]


override func viewDidLoad() {
    super.viewDidLoad()
   navigationController?.navigationBar.isHidden = true


    self.statePicker.delegate = self
    self.statePicker.dataSource = self
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if self.offer != nil {
        collegeField.text = self.offer?.college
        headCoachField.text = self.offer?.headCoach
    }

}





@IBAction func savePressed(_ sender: UIButton) {
    let uid = Auth.auth().currentUser?.uid

    if offer == nil {
        offer = Offer()
    }


    offer?.college = self.collegeField.text
    offer?.headCoach = self.headCoachField.text
    offer?.email = self.emailField.text
    offer?.skype = self.skypeField.text
    offer?.notes = self.notesField.text


    let ref = Database.database().reference()
    let key = ref.child("MyOffers").childByAutoId().key

    let dictionaryOffers = ["College" : offer?.college,
                            "Email" : offer?.email,
                            "HeadCoach" : offer?.headCoach,
                            "Skype" : offer?.skype,
                            "Notes" : offer?.notes]

    let childUpdates = ["Users/MyOffers/\(key)": [dictionaryOffers]]
    ref.updateChildValues(childUpdates, withCompletionBlock: { (error, ref) -> Void in

        self.navigationController?.popViewController(animated: true)

    }) 

}

}

OfferCell

 class MyOfferCell: UITableViewCell {

@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var subtitleLabel: UILabel!

}

firebase数据库结构在这里

enter image description here

【问题讨论】:

  • "cell?.titleLabel.text = offer[indexPath.row].college "这里的college是Offers的字符串或者对象?
  • 这是一个可选字符串@NaumanMalik
  • 确保单元格插座连接正确,并且在 CellForAtIndex 中使用检查点确保您在表格重新加载后获得数据,您可以尝试使用一些静态文本。

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


【解决方案1】:
cell?.titleLabel.text = offers[indexPath.row].college
cell?.subtitleLabel.text = offers[indexPath.row].headCoach

在您的数据库中,您没有尝试在 loadView 方法 中解析的键 collegeEmail 的值。

在您的 firebase 响应中,您会获得以下值: abc123L6wb_mGe7BJyWVPhriP

请检查数据库。如果那里缺少这些键,则手动添加它,您应该能够找到带有数据的 tableView。

请注意,如果您尝试将任何对象推送到 firebase 并且值(例如 emailId)为 nil,则不会在后端创建它。

因此,请确保您正在向您的电子邮件密钥发送一个值,否则它将在 firebase 中不可见

【讨论】:

  • 仍在调试器中打印出结果,但没有连接到我的插座。甚至有三行单独的数据,我输入的只是没有标签。我不知道这是插座的问题还是不是我都检查过它们并且它们是连接的吗?还在选定的行时,ColleDetailvc span>没有信息
  • 您是否对您的标签进行了限制?此外,在重新加载表之前,在 for 循环操作之后打印主数组。检查数据源是否有新附加的值
  • 目前还没有。如果你想看一下,我在 GitHub 上有吗?
  • 我也认为这可能是我的数据库结构?在我的加载数据中,我试图降低当前用户的报价。此时我刚刚通过在数据库中使用 autoID 引用它并简单地添加 true 来硬编码测试数据。在用户节点中。您可以在屏幕截图中看到上面的内容。
  • 如果是你的结构,你不应该得到你之前打印的值
【解决方案2】:

您在 Main.storyboard 上的 OfferCell 原型单元格上使用 UITableViewCell "Subtitle" 样式,它有自己的标签实现。

你有两个选择:

1) 使用“Subtitle”单元格样式的默认实现:(textLabel 和 detailTextLabel 是“Subtitle”单元格样式的默认标签)。

// Change this lines of code:
  cell?.titleLabel.text = offers[indexPath.row].college
  cell?.subtitleLabel.text = offers[indexPath.row].headCoach

// With this ones:
  cell?.textLabel?.text = offers[indexPath.row].college
  cell?.detailTextLabel?.text = offers[indexPath.row].headCoach

2) 使用单元格样式的自定义实现:

这样,您的出口将出现在您的自定义单元格中。

注意: 使用此实现将从单元格中删除您的 titleLabel 和 subtitleLabel,您需要再次添加它们并应用相应的约束。

希望这会对你有所帮助。

O.M.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多