Ответ 1
Попробуйте удалить self.table.registerClass(QuestionTableViewCell.self, forCellReuseIdentifier: "cell")
Я застрял в этой проблеме в течение нескольких дней, поэтому я был бы очень рад, если бы кто-то мог помочь. Я пытаюсь создать динамический UITableView, для которого я создал пользовательский подкласс UITableView, и я создал собственный подкласс UITableViewCell, так как мне нужно несколько UILabels и UIButton в каждой ячейке. Ячейка создана, но проблема в том, что значение меток всегда равно nil, поэтому ячейка отображается неправильно. Вот как выглядит раскадровка, и это то, что я вижу при запуске программы.
Здесь мой подкласс UITableViewCell:
import UIKit
class QuestionTableViewCell: UITableViewCell {
@IBOutlet var student: UILabel!
@IBOutlet var labDesk: UILabel!
@IBOutlet var topic: UILabel!
@IBOutlet var answers: UILabel!
}
и мой подкласс 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
}
}
Попробуйте удалить self.table.registerClass(QuestionTableViewCell.self, forCellReuseIdentifier: "cell")
Если вы используете ячейку с наконечником, убедитесь, что вы регистрируете ячейку с табличным представлением с помощью registerNib:forCellReuseIdentifier:
Если ячейка имеет класс, то используйте registerClass:forCellReuseIdentifier:
Во-первых, вам не нужно регистрировать класс, если он существует в Interface Builder.
Во-вторых, вы должны dequeueReusableCellWithIdentifier:forIndexPath
вместо dequeueReusableCellWithIdentifier
.
В-третьих, UITableViewController
уже имеет свойство tableView
поэтому нет необходимости делать IBOutlet для table
поскольку UITableViewController уже обрабатывает это. Он также соответствует UITableViewDataSource
и UITableViewDataSource
поэтому они являются посторонними.
В-четвертых, не устанавливайте свойства table
для их table
для tableView
.
В-пятых, cell.labDesk.text = ""
достаточно, не нужно делать его необязательным.
Если все ваши IBOutlets подключены, идентификаторы ячеек правильно установлены, и эти изменения будут выполнены, он будет работать.
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
}
}
Для тех, кто все еще пытается понять это, пробовав все эти возможные решения:
Отсоединить/Подсоединить IBOutlets в ваших раскадровки, нужно сделать трюк!
Возможно, я опаздываю, но я решил проблему с аналогичными проблемами.
Убедитесь, что вы установили идентификатор в InterfaceBuilder на свой UITableViewCell.