Подтвердить что ты не робот

Пользовательская ячейка таблицы: ярлык IBOutlet равен нулю

Рассмотрим следующий простой контроллер вида:

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
    }
}

И пользовательский вид ячейки:

class CustomTableViewCell: UITableViewCell {
    @IBOutlet weak var titleLabel: UILabel!   
}

Этот код вызывает следующую ошибку.

фатальная ошибка: неожиданно найден ноль при развертывании необязательного значения

titleLabel - ноль - непонятно почему. Установка свойств по умолчанию для UITableViewCell (например, textLabel) работает очень хорошо.

Я использую перо для пользовательской ячейки.

И метки, и табличные представления правильно связаны с их IBOutlet.

labeltable view

Как ячейка прототипа, так и пользовательское представление пера помечаются как имеющие класс CustomTableViewCell.

Я новичок в разработке для iOS, я что-то упускаю из виду?

Доступен пример проекта Xcode.

4b9b3361

Ответ 1

Во-первых, вы используете файл nib для загрузки вашей настраиваемой ячейки в таблицу. Вероятно, это будет скорее головная боль, чем стоит, если вы новичок в Swift/ Cocoa. На данный момент я бы переместил все на раскадровку. Вместо того, чтобы использовать файл с файлом nib, перейдите в Storyboard, нажмите на UITableView и убедитесь, что параметр содержимого TableView Dyanamic Prototypes:

enter image description here

Затем щелкните ячейку прототипа (единственную в представлении таблицы) и установите класс CustomTableViewCell и установите его идентификатор повторного использования в customCell:

enter image description hereenter image description here

Затем добавьте метку в ячейку прототипа и привяжите ее к IBOutlet в классе CustomTableViewCell. Вам не нужно регистрировать свой customCell, пока вы установите идентификатор повторного использования в раскадровке. Удалить эту строку:

self.tableView.registerClass(CustomTableViewCell.self, forCellReuseIdentifier: "customCell")

и он должен работать.

Ответ 2

попробуйте это

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
    }
}

Ответ 3

Вы должны использовать dequeueReusableCellWithIdentifier:forIndexPath, чтобы удалить ячейки.

Если вы используете раскадровку для создания ячеек, вам не нужно регистрировать класс для повторного использования, поскольку раскадровка делает это для вас, если вы установите идентификатор повторного использования.

Ответ 4

Зарегистрируйте свой пих как это:

let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "PickerCell", bundle: bundle)
collectionViewPicker.register(nib, forCellWithReuseIdentifier: "cell")

Ответ 5

Пожалуйста, убедитесь, что вы не ошибаетесь во время регистрации вашего nib (пользовательской ячейки) в viewdidload. Имя нити и повторное использованиеИдентификаторы не должны ошибаться.

Ответ 6

Я все сделал правильно, но я все еще получаю эту ошибку:

  • Зарегистрировать пользовательское перо в viewDidLoad
  • Отключите и снова подключите каждую розетку.

Я наконец-то решил проблему, воссоздав новый xib. ВНИМАНИЕ: вы должны воссоздать xib с нуля! Потому что, если вы скопируете, это не сработает!

Мне кажется, проблема XCode.

Ответ 7

Вывод в вашем CustomTableViewCell должен иметь сильную ссылку.

Заменить

@IBOutlet weak var titleLabel: UILabel! 

с

@IBOutlet var titleLabel: UILabel! 

Ответ 8

Работает без меня!

ИЗМЕНИТЬ

    let challenge = self.challenges![indexPath.row]

    let title = challenge["name"]
    if title != nil {
        cell.titleLabel.text = title
    }