Hello à tous,
J’ai un petit soucis qui me fait tourner en rond sur un crash de mon app quand je recharge une TableView avec un message d’erreur qui me dit Fatal error: Index out of range
. J’ai bien essayé de comprendre par moi même avec des print()
à des moments clés, mais je ne trouve pas, du coup, je sollicite votre aide
Cela vient TRÈÈÈÈÈÈÈÈÈÈS probablement du moment où j’appelle tableView.reloadData()
//
// SongHistoryViewController.swift
// x3
//
// Created by Didier Mauras on 27/08/2018.
// Copyright © 2018 xxxxxxxxxxxxxxxxx. All rights reserved.
//
import UIKit
class SongHistoryViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var _songHistory:[Track] = []
let refreshControl = UIRefreshControl()
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
refreshControl.addTarget(self, action: #selector(refresh(_:)), for: .valueChanged)
if #available(iOS 10.0, *) {
tableView.refreshControl = refreshControl
tableView.refreshControl?.tintColor = #colorLiteral(red: 0.9335525036, green: 0.667769134, blue: 0, alpha: 1)
} else {
tableView.backgroundView = refreshControl
}
}
override func viewWillAppear(_ animated: Bool) {
updateHistory()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if _songHistory.count == 0 {
tableView.setEmptyView(smiley: "🤷🏻♂️" ,title: "La playlist est vide...", message: "Une émission est en cours?")
}
else {
tableView.restoreTV()
}
return _songHistory.count
}
@IBAction func gestureViewTouched(_ sender: Any) {
closeWindow()
}
@objc func refresh(_ refreshControl: UIRefreshControl) {
// Do your job, when done:
updateHistory()
refreshControl.endRefreshing()
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "songHistory-cell", for: indexPath) as! SongHistoryTableViewCell
print("reloading data", indexPath.row)
let songHistory:Track = _songHistory[indexPath.row]
cell.ui_titleLabel.text = songHistory.title
cell.ui_artistLabel.text = songHistory.artist
if let coverUrl = songHistory.cover300,
coverUrl != "https://xxxxxxxxxxxxxxxxx.fr/cover/300_0-0.jpg",
coverUrl != "https://xxxxxxxxxxxxxxxxx.fr/cover/200_0-0.jpg",
let jacketURL = URL(string: coverUrl) {
cell.ui_jackImage.af_setImage(withURL: jacketURL, placeholderImage: #imageLiteral(resourceName: "xxxxxxxxxxxxxxxxx"))
} else {
cell.ui_jackImage.image = #imageLiteral(resourceName: "xxxxxxxxxxxxxxxxx")
}
let formatter = DateFormatter()
formatter.dateFormat = "HH:mm:ss"
let laDate = formatter.string(from: songHistory.date!)
cell.ui_dateLabel.text = String.localizedStringWithFormat(NSLocalizedString("played at %@", comment: "specifies when a song has been played"), laDate)
return cell
}
@objc func updateHistory(_ sid:Int = 1) {
let onair = Player.shared.getName()
var stationId:Int
switch onair {
case "xxxxxxxxxxxxxxxxx":
stationId = 1
case "xxxxxxxxxxxxxxxxx":
stationId = 2
case "xxxxxxxxxxxxxxxxx":
stationId = 3
case "xxxxxxxxxxxxxxxxx":
stationId = 4
default:
stationId = 1
}
print("refreshing", onair)
self._songHistory.removeAll()
let jsonUrl = "https://xxxxxxxxxxxxxxxxx.com/xxxxxxxxxxxxxxxxx/getplaylist?xxxxxxxxxxxxxxxxx=\(stationId)"
guard let url = URL(string: jsonUrl) else { return }
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else { return }
do {
let radio = try JSONDecoder().decode(Station.self, from: data)
guard let tracks = radio.tracks else { return }
for tracks in tracks {
self._songHistory.append(tracks)
}
DispatchQueue.main.async {
print("reload data")
self.tableView.reloadData()
}
print("_songHistory is filled")
} catch let jsonErr {
print("JSON error : ", jsonErr)
}
}.resume()
}
func closeWindow() {
dismiss(animated: true, completion: nil)
}
}
Merci à vous si vous trouvez, parce que moi, je sèche
Didier