【发布时间】: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数据库结构在这里
【问题讨论】:
-
"cell?.titleLabel.text = offer[indexPath.row].college "这里的college是Offers的字符串或者对象?
-
这是一个可选字符串@NaumanMalik
-
确保单元格插座连接正确,并且在 CellForAtIndex 中使用检查点确保您在表格重新加载后获得数据,您可以尝试使用一些静态文本。
标签: ios swift uitableview firebase firebase-realtime-database