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

时间:2019-11-08 16:20:50

标签: ios swift

我有一个从Firebase数据库加载数据的表格视图。当我打开我的应用程序时,数据不会填充。它崩溃并导致错误索引超出范围。我对xcode还是很陌生,希望能提供帮助。我已经获得了有关如何修复具有多个数组的代码的建议,但每个提出建议的人都忘记了我是新手,并且意识到我也将imageurls拉到了表格视图中,并且不知道如何将他们的建议采纳到我的代码中。如果我可以通过此错误得到帮助,那就太好了。

import UIKit
import FirebaseAuth
import FirebaseDatabase

class EventsViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {



    @IBOutlet weak var tableView: UITableView!

    var eventsRef: DatabaseReference?
    var eventsDatabaseHandle:DatabaseHandle?


    var eventsTitles = [String]()
    var eventTimestamps = [String]()
    var eventsLocations = [String]()
    var eventsImages = [UIImage]()



    @IBOutlet weak var addEventsButton: UIBarButtonItem!


    override func viewDidLoad() {
        super.viewDidLoad()

    adminAuth()

    eventsRef = Database.database().reference()

    tableView.reloadData()

    tableView.transform = CGAffineTransform(rotationAngle: -CGFloat.pi)

    tableView.delegate = self
    tableView.dataSource = self

    eventsDatabaseHandle = eventsRef?.child("Church Events").observe(.childAdded, with: { (snaphot) in

    let eventPost = snaphot.value as! [String: Any]


    self.eventTimestamps.append(eventPost["eventdate"] as! String)


    self.eventsTitles.append(eventPost["eventtitle"] as! String)

    self.eventsLocations.append(eventPost["eventlocation"] as! String)

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

    if let image: UIImage = UIImage(data: data!) {
    self.eventsImages.append(image)
            }

        }

        task.resume()
        self.tableView.reloadData()
        })


}


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return eventsTitles.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "events") as! EventsTableViewCell

       // let image = eventsImages[indexPath.row]

     cell.flyerImages.image? = eventsImages[indexPath.row] **<- index out of range**

        cell.eventTitle.text! = eventsTitles[indexPath.row]

        cell.eventDate.text! =  eventTimestamps[indexPath.row]

        cell.eventLocation.text! = eventsLocations[indexPath.row]


        cell.transform = CGAffineTransform(rotationAngle: CGFloat.pi)


        return cell
    }


    func adminAuth() {

        if (Auth.auth().currentUser!.displayName != "Neil Leon")  {
            self.addEventsButton.tintColor = UIColor.clear
            self.addEventsButton.isEnabled = false

        }
        else{

            self.addEventsButton.isEnabled = true
        }

    }

}``````

1 个答案:

答案 0 :(得分:1)

目前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()

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
}