Sulthan la réponse est intelligente, mais la vraie solution est: ne pas appeler à l' dequeueReusableCellWithIdentifier
. Qui était votre erreur au départ.
Cette méthode est complètement dépassé, et je suis surpris qu'il n'a pas été formellement déconseillé; aucun système qui peut accueillir Swift (iOS 7 ou iOS 8) a besoin d'elle pour quelque fin que ce soit.
Au lieu de cela, appelez la méthode moderne, dequeueReusableCellWithIdentifier:forIndexPath:
. Ceci a l'avantage qu' aucune options sont impliqués; vous garantis que, une cellule sera retourné. Tous les points d'interrogation et points d'exclamation tomber, vous pouvez utiliser let
au lieu de var
, car la cellule de l'existence est garantie, et vous vivez dans la pratique, le monde moderne.
Vous devez, si vous n'êtes pas à l'aide d'un storyboard, inscrivez la table pour cet identifiant à l'avance, l'enregistrement d'une classe ou d'une plume. Les classiques endroit pour le faire, c'est - viewDidLoad
, ce qui est dès l'affichage de la table existe.
Voici un exemple d'utilisation d'une cellule personnalisé de classe:
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.registerClass(MyCell.self, forCellReuseIdentifier: "Cell")
}
// ...
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath:indexPath) as MyCell
// no "if" - the cell is guaranteed to exist
// ... do stuff to the cell here ...
cell.textLabel.text = // ... whatever
// ...
return cell
}
Mais si vous êtes à l'aide d'un storyboard (qui la plupart des gens le font), vous n'avez même pas besoin d'enregistrer la vue de la table en viewDidLoad
! Il suffit d'entrer l'identificateur de cellule dans la table de montage séquentiel et vous êtes bon pour aller avec dequeueReusableCellWithIdentifier:forIndexPath:
.