gpt4 book ai didi

swift - fatal error : Index out of range - Swift 4 and Firebase

转载 作者:行者123 更新时间:2023-11-30 11:38:30 24 4
gpt4 key购买 nike

我正在使用 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)

----> ...

最佳答案

看起来您在实际获取事件的开始和结束时间之前调用了 reloadData(),因此 startTimeArray 和 endTimeArray 在您刚刚从 firebase 获取的事件的索引处不会有对象。

另请注意,使用 Firebase 您是在设置观察,而不是立即获取所有数据。也许一些简单的类,如事件:

class Event {
var name: String
var startTime: String
var endTime: String

init(name: String) {
self.name = name
self.startTime = "" //or some other sensible default before loading
self.endTime = "" //or some other default
}

}

然后使用您的表格 View 使用的事件对象数组而不是字符串数组,并在从 Firebase 获取新数据时更新事件对象并刷新表格 View

关于swift - fatal error : Index out of range - Swift 4 and Firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49470848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com