Considérez le contrôleur de vue simple suivant:
class ViewController: UIViewController, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
var items = ["One", "Two", "Three"]
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.registerClass(CustomTableViewCell.self, forCellReuseIdentifier: "customCell")
self.tableView.dataSource = self
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.items.count;
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("customCell") as CustomTableViewCell
cell.titleLabel!.text = self.items[indexPath.row]
return cell
}
}
Et vue de cellule personnalisée:
class CustomTableViewCell: UITableViewCell {
@IBOutlet weak var titleLabel: UILabel!
}
Ce code provoque l'erreur suivante.
erreur fatale: trouvé de manière inattendue nil lors du déroulement d'une valeur facultative
titleLabel
est nul - on ne sait pas pourquoi. La définition des propriétés par défaut de UITableViewCell
(comme textLabel
) fonctionne parfaitement.
J'utilise une plume pour la cellule personnalisée.
Les étiquettes et les vues de table sont correctement connectées à leur IBOutlet
s.
La cellule prototype et la vue nib personnalisée sont marquées comme ayant une classe CustomTableViewCell
.
Je suis nouveau dans le développement iOS, est-ce qu'il me manque quelque chose d'évident?
Tout d’abord, vous utilisez un fichier nib pour charger votre cellule personnalisée dans le tableau. Cela va probablement causer plus de maux de tête que ça vaut la peine si vous débutez dans Swift/Cocoa. Pour le moment, je mettrais tout en place dans le scénarimage. Au lieu d'utiliser un fichier nib, cliquez sur, allez dans Storyboard, cliquez sur votre UITableView
et assurez-vous que le paramètre de contenu de TableView est Dyanamic Prototypes
:
Ensuite, cliquez sur la cellule prototype (la seule de la vue tableau), définissez la classe sur CustomTableViewCell
et définissez son identificateur de réutilisation sur customCell
:
Ensuite, ajoutez une étiquette à votre cellule prototype et reliez-la à IBOutlet dans votre classe CustomTableViewCell
. Vous n'avez pas besoin d'enregistrer votre customCell
tant que vous avez défini l'identifiant de réutilisation dans le storyboard. Supprimer cette ligne:
self.tableView.registerClass(CustomTableViewCell.self, forCellReuseIdentifier: "customCell")
et ça devrait fonctionner.
essaye ça
import UIKit
class ViewController: UIViewController, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
var items = ["One", "Two", "Three"]
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.registerNib(UINib(nibName: "CustomTableViewCell", bundle: nil), forCellReuseIdentifier: "customCell")// CustomTableViewCell.self, forCellReuseIdentifier: "customCell")
self.tableView.dataSource = self
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.items.count;
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("customCell", forIndexPath: indexPath) as CustomTableViewCell
cell.titleLabel!.text = self.items[indexPath.row]
return cell
}
}
Enregistrez votre nib comme ceci:
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "PickerCell", bundle: bundle)
collectionViewPicker.register(nib, forCellWithReuseIdentifier: "cell")
Tu devrais utiliser dequeueReusableCellWithIdentifier:forIndexPath
pour retirer les cellules.
Si vous utilisez le storyboard pour créer les cellules, vous ne devriez pas avoir besoin d'enregistrer la classe pour la réutiliser, car le storyboard le fait pour vous si vous définissez le paramètre reuseIdentifier.
Assurez-vous de ne commettre aucune erreur en enregistrant votre nib (cellule personnalisée) dans le viewdidload. Le nom de la partition et les identificateurs de réutilisation ne doivent pas être erronés.