Простой 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
    }