致命错误:索引超出范围 - Swift 4和Firebase

时间:2018-03-24 23:01:07

标签: swift firebase indexing indexoutofrangeexception

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

----> ...

1 个答案:

答案 0 :(得分:0)

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

还要考虑使用Firebase,您可以设置观察而不是一次性获取所有数据。也许像Event这样的简单类:

{{1}}

然后有一个使用您的tableview而不是字符串数组的Event对象数组,并在从Firebase获取新数据时更新Event对象并刷新表视图