Cela fait des jours que je suis coincé dans ce problème, je serais donc très heureux si quelqu'un pouvait m'aider. J'essaie de créer un UITableView dynamique, pour lequel j'ai créé une sous-classe UITableView personnalisée et j'ai a également créé une sous-classe UITableViewCell personnalisée, car il me faut plusieurs étiquettes UIL et un bouton UIButton dans chaque cellule. La cellule est créée, mais le problème est que la valeur des étiquettes est toujours nulle. affiché correctement. C’est , à quoi ressemble le storyboard, et c’est ce que je vois pendant l’exécution du programme.
Voici ma sous-classe UITableViewCell:
import UIKit
class QuestionTableViewCell: UITableViewCell {
@IBOutlet var student: UILabel!
@IBOutlet var labDesk: UILabel!
@IBOutlet var topic: UILabel!
@IBOutlet var answers: UILabel!
}
et ma sous-classe UITableView:
import UIKit
class QuestionViewController: UITableViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet var table: UITableView!
struct Question {
var student: String
var labDesk: String
var topic: String
var answered: String
}
override func viewDidLoad() {
super.viewDidLoad()
table.estimatedRowHeight = 50
table.dataSource = self
table.delegate = self
self.table.registerClass(QuestionTableViewCell.self, forCellReuseIdentifier: "cell")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell") as QuestionTableViewCell
cell.student.text = "random string"
cell.labDesk?.text = "25/A"
cell.topic?.text = "string"
cell.answers?.text = "3"
return cell
}
}
Essayez de supprimer self.table.registerClass(QuestionTableViewCell.self, forCellReuseIdentifier: "cell")
Si vous utilisez une cellule avec un nib, assurez-vous que vous enregistrez la cellule avec la vue tableau à l'aide de registerNib:forCellReuseIdentifier:
. Si la cellule a juste une classe, utilisez registerClass:forCellReuseIdentifier:
.
Tout d'abord, vous n'avez pas besoin d'enregistrer la classe si elle existe dans Interface Builder.
Deuxièmement, vous devriez dequeueReusableCellWithIdentifier:forIndexPath
au lieu de dequeueReusableCellWithIdentifier
.
Troisièmement, UITableViewController
a déjà une propriété appelée tableView
, il n’est donc pas nécessaire de définir un IBOutlet sur table
car UITableViewController le gère déjà. Il est également conforme à la UITableViewDataSource
et à la UITableViewDataSource
, elles sont donc superflues.
Quatrièmement, ne définissez pas les propriétés pour table
, définissez-les pour tableView
.
Cinquièmement, cell.labDesk.text = ""
est suffisant, inutile de le rendre facultatif.
Si tous vos IBOutlets sont connectés, que les identificateurs de cellule sont correctement définis et que ces révisions sont effectuées, cela fonctionnera.
class QuestionTableViewCell: UITableViewCell {
@IBOutlet var student: UILabel!
@IBOutlet var labDesk: UILabel!
@IBOutlet var topic: UILabel!
@IBOutlet var answers: UILabel!
}
class QuestionViewController: UITableViewController {
struct Question {
var student: String
var labDesk: String
var topic: String
var answered: String
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.estimatedRowHeight = 50
tableView.dataSource = self
tableView.delegate = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as QuestionTableViewCell
cell.student.text = "random string"
cell.labDesk.text = "25/A"
cell.topic.text = "string"
cell.answers.text = "3"
return cell
}
}
Pour ceux qui essaient encore de comprendre cela après avoir essayé toutes les solutions possibles:
Déconnecter/Reconnecter les IBOutlets de vos Storyboards devrait faire l'affaire!
Je suis peut-être en retard ici, mais je viens de résoudre un problème similaire.
Assurez-vous que vous avez défini l'identifiant dans InterfaceBuilder sur votre UITableViewCell.