Ios 索引超出范围错误使我的应用程序不断崩溃

Ios 索引超出范围错误使我的应用程序不断崩溃,ios,swift,Ios,Swift,我有一个从firebase数据库加载数据的tableview。当我打开应用程序时,数据不会填充。它崩溃并将错误索引抛出范围之外。我是xcode新手,非常感谢您的帮助。我已经收到了关于如何修复多个数组的代码的建议,但是所有提出建议的人都忘记了我是新手,并且意识到我也在将ImageURL拉入我的tableview,并且不知道如何将他们的建议应用到我的代码中。如果我能得到帮助,通过这个错误,那就太棒了 导入UIKit 导入FirebaseAuth 导入FirebaseDatabase 类事件ViewC

我有一个从firebase数据库加载数据的tableview。当我打开应用程序时,数据不会填充。它崩溃并将错误索引抛出范围之外。我是xcode新手,非常感谢您的帮助。我已经收到了关于如何修复多个数组的代码的建议,但是所有提出建议的人都忘记了我是新手,并且意识到我也在将ImageURL拉入我的tableview,并且不知道如何将他们的建议应用到我的代码中。如果我能得到帮助,通过这个错误,那就太棒了

导入UIKit
导入FirebaseAuth
导入FirebaseDatabase
类事件ViewController:UIViewController、UITableViewDelegate、UITableViewDataSource{
@IBVAR表格视图:UITableView!
var eventsRef:数据库引用?
var eventsDatabaseHandle:数据库句柄?
var eventsTitles=[String]()
var eventTimestamps=[String]()
var eventsLocations=[String]()
var eventsImages=[UIImage]()
@IBOutlet弱var addEventsButton:UIBarButtonim!
重写func viewDidLoad(){
super.viewDidLoad()
adminAuth()
eventsRef=Database.Database().reference()
tableView.reloadData()
tableView.transform=CGAffineTransform(旋转角度:-CGFloat.pi)
tableView.delegate=self
tableView.dataSource=self
eventsDatabaseHandle=eventsRef?.child(“教堂事件”).observe(.childAdded,带:{(snaphot)in
让eventPost=snaphot.value为![String:Any]
self.eventTimestamps.append(eventPost[“eventdate”]as!String)
self.eventsTitles.append(eventPost[“eventtitle”]as!String)
self.eventsLocations.append(eventPost[“eventlocation”]作为!字符串)
让task=URLSession.shared.dataTask(带有:URL(string:eventPost[“ImageUrl”]as!string)!{(数据、响应、错误)
如果让image:UIImage=UIImage(数据:data!){
self.eventsImages.append(图像)
}
}
task.resume()
self.tableView.reloadData()
})
}
func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
返回eventsTitles.count
}
func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
将cell=tableView.dequeueReusableCell(标识符为:“events”)设为!EventsTableViewCell
//让image=eventsImages[indexPath.row]

cell.flyerImages.image?=eventsImages[indexPath.row]***此时调用
reloadData
,图像数组为空并导致崩溃

使用自定义结构并在收到图像数据后重新加载表视图

struct Event {
    let title, timestamp, location : String
    var image : UIImage?
}

var events = [Event]()

...

eventsDatabaseHandle = eventsRef?.child("Church Events").observe(.childAdded, with: { (snaphot) in
let eventPost = snaphot.value as! [String: Any]
let event = Event(title: eventPost["eventtitle"] as! String,
                  timestamp: eventPost["eventdate"] as! String,
                  location: eventPost["eventlocation"] as! String,
                  image: nil)

let task = URLSession.shared.dataTask(with: URL(string: eventPost["ImageUrl"] as! String)!) { data, _, error in

    if let error = error {
        print(error)
    } else {
        event.image = UIImage(data: data!)
        DispatchQueue.main.async {
           self.events.append(event)
            self.tableView.reloadData()
        }
    }
}
task.resume()


你最大的错误是使用多个数组作为数据源。不要这样做。使用一个包含关于一个对象的所有信息的自定义结构。这解决了问题。嗨,瓦迪亚,我真的很新,不知道如何使我一直在尝试的工作。每当我必须在自定义结构中添加不同的值时,我都会被抛弃,在这种情况下,我的“eventsimages”哇,太棒了。它正在工作。非常感谢你,我感谢你抽出时间。
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return events.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "events", for: indexPath) as! EventsTableViewCell
    let event = events[indexPath.row]
    cell.flyerImages.image = event.image
    cell.eventTitle.text = event.title
    cell.eventDate.text =  event.timestamp
    cell.eventLocation.text = event.location
    cell.transform = CGAffineTransform(rotationAngle: CGFloat.pi)
    return cell
}