Swift: Impossible de convertir la valeur de type 'UITableViewCell' en une class de cellule personnalisée

Je travaille sur l'application iOS, qui doit extraire datatables de Firebase et les afficher dans un tableau. Pour lui donner un design personnalisé, j'ai créé une class de cellule de vue de table personnalisée. Lorsque j'essaie d'afficher datatables renvoyées par Firebase dans la méthode "populateCellWithBlock", l'application est écrasée, affichant cette erreur:

Impossible de convertir la valeur de type 'UITableViewCell' (0x10a73f9f0) en 'EFRideSharing.RideTableViewCell' (0x108117f20).

dataSource = FirebaseTableViewDataSource(ref: ref, cellReuseIdentifier: "rideCell", view: self.ridesTableView) dataSource.populateCellWithBlock { (cell,snapshot) -> Void in let tvc: RideTableViewCell = cell as! RideTableViewCell let snapshot: FDataSnapshot = snapshot as! FDataSnapshot tvc.toLabel.text = snapshot.value["time"] as? Ssortingng } 

Des idées pour le faire fonctionner?

Mise à jour: morceaux de code supplémentaires

 class RideTableViewCell: UITableViewCell { @IBOutlet weak var timeLabel: UILabel! @IBOutlet weak var toLabel: UILabel! @IBOutlet weak var fromLabel: UILabel! override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } } 

Auteur de FirebaseUI-iOS ici.

On dirait que le problème est que nous returnnons un UITableViewCell plutôt qu'un RideTableViewCell raison du fait que la class par défaut de la cellule returnnée par FirebaseTableViewDataSource est UITableViewCell lorsque la propriété cellClass n'est pas définie.

Vous pouvez utiliser la version du constructor qui contient cellClass pour résoudre ce problème:

 dataSource = FirebaseTableViewDataSource(ref: ref, cellClass: RideTableViewCell.self, cellReuseIdentifier: "rideCell", view: self.ridesTableView) 

Cela nous permettra de renvoyer les versions de l'object correctement castées. Aussi, pour résoudre les problèmes de connaître le type de la cellule de manière statique sur la population, w peut faire ce qui suit.

En Objective-C c'est très facile, car on peut donner un type différent aux propriétés du bloc:

 [self.dataSource populateCellWithBlock:^(YourCustomCellClass *cell, FDataSnapshot *snap) { // Populate cell as you see fit }]; 

Parce que nous utilisons __kindof UITableViewCell comme argument où disponible ( id quand non, donc pré XCode 7), ce comportement fonctionne comme prévu dans n'importe quelle version de XCode, puisque XCode acceptera "Oui, cette class est une sous-class de UITableViewCell" (> = XCode 7) ou "Si c'est un id je peux toujours lui envoyer un message, donc je l'autorise" (<= XCode 6.4).

Swift est une histoire différente. Alors que vous penseriez que vous devriez être capable de faire:

 dataSource.populateCellWithBlock{ (cell: YourCustomClass, snapshot: FDataSnapshot) -> Void in // Populate cell as you see fit } 

Et obtenez des versions raisonnables et préfabriquées des cellules. Cela dit, j'ai toujours eu des erreurs en disant que les signatures de methods ne correspondent pas en comparant AnyObject à YourCustomClass et en l' YourCustomClass comme un problème d'Apple avec __kindof , qui est l'une des fonctionnalités les less documentées que je connaisse. Si quelqu'un a des idées sur la raison pour laquelle cela pourrait être le cas, ou connaît une meilleure documentation, j'aimerais entendre d'où cela vient (ou si c'est corrigé dans la version GM de XCode 7).