我正在使用XCode 8和Swift 4创建一个iOS应用程序来跟踪事件。我正在使用Firebase作为此应用的数据库工具。我正在进入超出范围的"指数"下面的代码中的错误。我正在使用for循环来读取Firebase数据库中每个事件的事件开始和结束时间。代码能够返回事件名称,但不能返回下面的时间。为什么会这样?我的代码有问题,或者我的数据库结构有问题吗?使用的数据库结构粘贴在此处的代码下方。
代码在这里:
import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase
class Event_List_Controller: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
var eventList = [String]()
var startTimeArray = [String]()
var endTimeArray = [String]()
var ref: DatabaseReference?
var handle:DatabaseHandle?
override func viewDidLoad() {
super.viewDidLoad()
endTimeArray.removeAll()
tableView.delegate = self
tableView.dataSource = self
let emailfinal = UserDefaults.standard.string(forKey: "splicedEmailStandard")
ref = Database.database().reference()
handle = ref?.child(emailfinal!).child("Event Data").observe(.childAdded, with: { (snapshot) in
if let item = snapshot.value as? String {
self.eventList.append(item)
self.tableView.reloadData()
}
})
// FOR LOOP THAT POPULATES THE START AND END TIMES
for individualEvents in eventList {
ref = Database.database().reference()
handle = ref?.child(emailfinal!).child("Event Data").child(individualEvents).child("Start Time").observe(.childAdded, with: { (snapshot) in
if let item = snapshot.value as? String {
self.startTimeArray.append("\(item)")
}
})
handle = ref?.child(emailfinal!).child("Event Data").child(individualEvents).child("End Time").observe(.childAdded, with: { (snapshot) in
if let item = snapshot.value as? String {
self.endTimeArray.append("\(item)")
}
})
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return eventList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCell(withIdentifier: "customClassCell") as! CustomTableViewCell
cell.classLabel.text = eventList[indexPath.row]
// FATAL ERROR: INDEX OUT OF RANGE HERE.
cell.timeLabel.text = "\(startTimeArray[indexPath.row]) - \(endTimeArray[indexPath.row])"
return cell
}
}
数据库结构:
email@email (User)
-> User Information
----> (Information)
---> Event Information
------> Event Name
----------> Event Start Time
----------> Event End Time
----------> Event Location
email@email (User 2)
----> ...
答案 0 :(得分:0)
看起来您在实际获取事件的开始和结束时间之前调用reloadData(),因此startTimeArray和endTimeArray在您刚刚获得的事件的索引处不会有对象来自firebase。
还要考虑使用Firebase,您可以设置观察而不是一次性获取所有数据。也许像Event这样的简单类:
{{1}}
然后有一个使用您的tableview而不是字符串数组的Event对象数组,并在从Firebase获取新数据时更新Event对象并刷新表视图