Простой UITableView в Swift - неожиданно найденный nil
Довольно простой код:
func numberOfSectionsInTableView(tableView: UITableView?) -> Int {
return 1
}
func tableView(tableView:UITableView!, numberOfRowsInSection section:Int) -> Int {
return 5
}
func tableView(tableView:UITableView!, cellForRowAtIndexPath indexPath:NSIndexPath!) -> UITableViewCell! {
let cell: BookTableViewCell = BookTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "BookCell")
println("ip: \(indexPath.row)")
cell.bookLabel.text = "test"
return cell
}
В строке cell.bookLabel.text я получаю следующее:
fatal error: unexpectedly found nil while unwrapping an Optional value
BookTableViewCell определяется следующим образом:
class BookTableViewCell: UITableViewCell {
@IBOutlet var bookLabel: 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
}
}
И bookLabel правильно подключен в ячейке Prototype в Storyboard. Почему я получаю эту ошибку?
Ответы
Ответ 1
Когда вы создаете представление в коде, его свойства IBOutlet
не подключаются должным образом. Вам нужна версия, которую вы вернетесь из dequeueReusableCellWithIdentifier
:
let cell = tableView.dequeueReusableCellWithIdentifier("BookCell") as BookTableViewCell
Ответ 2
Если вы используете раскадровку, убедитесь, что у вас нет этой строки в начале вашего файла:
self.tableView.registerClass(CustomTableViewCell.self, forCellReuseIdentifier: "customCell")
Он перезапишет раскадровку и, в результате, выходные ссылки в раскадровке будут проигнорированы.
Ответ 3
Я получал эту ошибку, потому что у меня не было идентификатора, записанного в раскадровке Custom Cell.
![StoryBoard]()
Также убедитесь, что он соответствует вашему коду:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCellWithIdentifier("CustomTableCell") as CustomTableCell
...
}
Ответ 4
Возможно, ваше представление в Main.Storyboard потеряло ссылку на IBOutlet в файле ViewController, просто добавьте его снова.
Ответ 5
Не забудьте зарегистрировать nib (проверено с Swift3), e. г. внутри переопределить func viewDidLoad():
self.tableView.register(UINib(nibName: "BookTableViewCell", bundle: nil), forCellReuseIdentifier: "BookCell")
Ответ 6
Причина, по которой этот вопрос часто задают, заключается в том, что это зависит от того, как вы настроили свое табличное представление и пользовательский CellClass. Вы создаете свое табличное представление в раскадровке или программно? Вы создаете собственные ячейки .xib и настраиваемые классы ячеек?
Если вы создали свое табличное представление программно и создали пользовательский класс .xib и класс Cell, то вот ответ для Swift 4:
in viewDidLoad:
customTable.register(UINib(nibName: "NibName", bundle: nil), forCellReuseIdentifier: "NibNameIdentifier")
in cellforRowat:
let cell = tableView.dequeueReusableCell(withIdentifier: "NibName") as! ClassName
Примечание. В файле .xib своей ячейки обязательно укажите свой идентификатор в инспекторе атрибутов ("NibNameIdentifier").
Ответ 7
В моем случае это был способ, по которому Опция распаковывается:
let cellId:String = "ConverterTableCell"
let cell: ConverterTableViewCell = (tableView.dequeueReusableCellWithIdentifier(cellId)! as? ConverterTableViewCell)!
Ответ 8
Попробуйте сделать это:
let cell = tableView.dequeueReusableCellWithIdentifier("BookCell", forIndexPath: indexPath) as! BookTableViewCell
и не забудьте установить идентификатор повторного использования в своем раскадровке
Ответ 9
Я получаю эту ошибку, когда я использую имя повторно использовать Identifer, отличное от имени класса
унифицировать эти имена решить это для меня
Ответ 10
Я столкнулся с этой ошибкой, если я поместил UITapGestureRecognizer в пользовательский UITableViewCell на раскадровке (версия Xcode - 8.3).
Ответ 11
В Свифт 5
Сначала я попытался зарегистрировать свой UITableViewCell в viewdidload(), используя класс и идентификатор, которые я упомянул ниже, но у меня это не сработало.
self.tableView.registerClass(MyCustomTableViewCell.self, forCellReuseIdentifier: "customCell")
Решение
Then I registered my UITableViewCell using Nib name and it worked for me
Зарегистрируйте свою ячейку в viewdidload(), используя имя Nib
override func viewDidLoad()
{
super.viewDidLoad()
// Do any additional setup after loading the view.
//register your table view cell in Viewdidload() using Nib Name
tableView.register(UINib.init(nibName: "MyCustomTableViewCell", bundle: nil), forCellReuseIdentifier: "customCell")
}
Ответ 12
Вам нужно проверить две вещи
1. Зарегистрируйте ячейку с именем пера в viewDidLoad
func viewDidLoad()
{
super.viewDidLoad()
listTableView.register(UINib.init(nibName: "ListProductCell", bundle: nil), forCellReuseIdentifier: "ListProductCell")
}
2. Создайте пользовательскую ячейку таким образом.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ListProductCell") as! ListProductCell
return cell
}