我正在尝试从我在firebase中的数据创建一个数组,这样我就可以在我的表视图中将其作为标题加载。当我在代码中将信息硬编码到数组中时,我知道如何将数据放入节标题中,但当数据在Firebase中时,我不确定如何这样做,我想将数据放入数组中,然后将其放入标题中。希望这是有意义的。
我的Firebase数据是
usclmainmenu events USCL Open House date: "September 31 2020" info: "Opening to new students" place: "USC Lancaster" time: "8 pm" title: "USCL Open House"
我从firebase获取数据的函数是:
private func getEventsFromFirebaseDB() { datref = Database.database().reference().child("events") datref.observe(DataEventType.value, with: { [weak self] (snapshot) in guard snapshot.childrenCount > 0 else { return } var events: [EventsInfo] = [] for event in snapshot.children.allObjects as! [DataSnapshot] { let object = event.value as? [String: AnyObject] let title = object?["title"] let place = object?["place"] let info = object?["info"] let date = object?["date"] let time = object?["time"] let event = EventsInfo(title: title as! String, place: place as! String, info: info as! String, time: time as! String, date: date as! String) events.append(event) } self?.eventsFetched(events) self?.eventTableView.reloadData() }) }
我的数据模型是:
class EventsInfo { var title: String var place: String var info: String var time: String var date: String init(title: String, place: String, info: String, time: String, date: String) { self.title = title self.place = place self.info = info self.time = time self.date = date } }
这是我对数据源和委托方法的扩展
extension EventsTableViewController: UITableViewDataSource, UITableViewDelegate { func numberOfSections(in tableView: UITableView) -> Int { sectionNames.count } func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { sectionNames[section] } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let char = sectionNames[section] return events[char]!.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = eventTableView.dequeueReusableCell(withIdentifier: "eventsCell") as! EventsTableViewCell let char = sectionNames[indexPath.section] let event = events[char]![indexPath.row] cell.eventTitleLabel.text = event.title return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { performSegue(withIdentifier: "showEvent", sender: self) }回答开始:得票数 1
问题中没有提到要用作部分标题的字符串,但根据前面的问题,我认为这些部分将是事件日期。那么在该日期发生的事件将在该日期部分中列出。
这个答案中的代码是未经测试的,它只是众多选项之一。我还对动态进行了一些更改,将更多的责任放在EventInfo类逻辑中处理快照,而不是循环中。
首先,我们从保存事件详细信息的对象开始。注意它是用Firebase数据快照初始化的。如果出现问题,它会利用可选参数的默认值。还请注意,我添加了一个跟踪Firebase键的eventID,以便稍后可以通过该id更改或删除该对象。
class EventInfo { var eventId: String var title: String var place: String var date: String init(eventSnap: DataSnapshot) { self.eventId = eventSnap.key self.title = eventSnap.childSnapshot(forPath: "title").value as? String ?? "No Title" self.place = eventSnap.childSnapshot(forPath: "title").value as? String ?? "No Place" self.date = eventSnap.childSnapshot(forPath: "date").value as? String ?? "Unknown Date" } }
然后是一个用于保存所有事件的类变量数组。这将用作部分标题和tableView数据的数据源
class EventSectionHeader { var eventDate = "" var eventArray = [EventInfo]() }
然后是一个类变量来保存所有的EventSectionHeaders
var eventSectionArray = [EventSectionHeader]()
最后,读取数据并填充dataSource的代码。
func getEventsFromFirebaseDB() { //var eventArray = [EventInfo]() let eventRef = Database.database().reference().child("events") eventRef.observeSingleEvent(of: .value, with: { snapshot in let allEventSnaps = snapshot.children.allObjects as! [DataSnapshot] for eventSnap in allEventSnaps { let event = EventInfo(eventSnap: eventSnap) if let foundEventSection = self.eventSectionArray.first(where: { $0.eventDate == event.date } ) { foundEventSection.eventArray.append(event) //found same date, add event } else { //eventSection with this date doesn't exist, add a new section with this date and add this // event to that new section let eventSection = EventSectionHeader() eventSection.eventDate = event.date self.eventSectionArray.append(eventSection) } } self.tableView.reloadData() }) }
上面的代码只读入一次所有事件,并且不会离开观察者。它遍历快照中的所有事件,为每个事件创建EventObjects,并检查是否已经存在任何事件日期(部分)。
如果是,则它添加到该sections日期数组的事件。
如果不是,则创建新的EventSectionHeader,设置日期并添加事件。
总结以上是真正的电脑专家为你收集整理的Swift 5- Firebase-从firebase中的数据创建阵列的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得真正的电脑专家网站内容还不错,欢迎将真正的电脑专家推荐给好友。
评论列表