Регистрация UITableViewCell не работает - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь зарегистрироваться UITableViewCell в viewdidload

self.tableView.register(CustomTableViewCell.self, forCellReuseIdentifier: "CustomTableViewCell")

В cellForRowAtIndex

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell") as! CustomTableViewCell  

    cell.productNameLabel.text = "Product"
    cell.productNameLabel.textColor = UIColor.darkGray

    return cell
}

Здесь происходит сбой cell.productNameLabel.text.

Какова цель регистрации ячейки?почему он падает?Я хочу перезагрузить данные, даже если ячейка или таблица не видны.

Аварийный отчет: enter image description here

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

См. Комментарии Apple, которые отвечают на ваш запрос с целью регистрации ячейки:

Прежде чем удалять любые ячейки из очереди, вызовите этот метод или метод регистрации (_: forCellReuseIdentifier :), чтобы сообщить таблицепосмотреть, как создать новые ячейки.Если ячейка указанного типа в данный момент не находится в очереди на повторное использование, табличное представление использует предоставленную информацию для автоматического создания нового объекта ячейки.

Это стандартная процедура, которую я применяю при работе с пользовательскими ячейками (если вы используете xib):

  1. Установить идентификатор ячейки в инспекторе атрибутов Xib:

enter image description here

Зарегистрировать Xib:

self.tableTasks.register(UINib(nibName: "TaskCell", bundle: nil), forCellReuseIdentifier: "taskCell")

Однако, если вы не используете Xib и создаете пользовательскую ячейку только с помощью кода, используйте registeCell:

self.tableView.register(CustomTableViewCell.self, forCellReuseIdentifier: "CustomTableViewCell")
0 голосов
/ 30 мая 2018

Мой метод для регистрационной ячейки.

Синтаксис сахар

protocol BSCellProtocol {
   // For `registerCell`
   static var NibName: String! { get }
   // For `registerCell`, `dequeueCellWithType`, and `dequeueHeaderFooterWithType`
   static var Identifier: String! { get }
}

extension UITableView {
    func registerCell(_ type: BSCellProtocol.Type) {
        let nib = UINib(nibName: type.NibName, bundle: nil)
        let identifier = type.Identifier!
        self.register(nib, forCellReuseIdentifier: identifier)
    }

    func dequeueCellWithType<T: BSCellProtocol>(_ type: T.Type) -> T {
        let cell = self.dequeueReusableCell(withIdentifier: type.Identifier) as! T
        return cell
    }
    func dequeueCellWithType<T: BSCellProtocol>(_ type: T.Type, index: IndexPath) -> T {
        let cell = self.dequeueReusableCell(withIdentifier: type.Identifier, for: index) as! T
        return cell
    }
}

Использование

class MyCustomCell: UITableViewCell, BSCellProtocol {
     static var NibName: String! = "MyCustomCell"
     static var Identifier: String! = "cellIdentifier_at_Xib"

     @IBOutlet weak var lblTitle: UILabel!
     // other IBOutlet components
}

// In ViewController, register cell
tableView.registerCell(MyCustomCell.self)

// dequeue cell
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     // cell is `MyCustomCell` instance 
     let cell = tableView.dequeueCellWithType(MyCustomCell.self)

     // configure cell ...
     // ....

     return cell
}
0 голосов
/ 30 мая 2018

Используете ли вы xib для этой клетки?Если это так, ни один из выходов не будет подключен, если вы просто зарегистрируете класс ячейки.Вам нужно зарегистрировать фактический xib-файл, чтобы все было правильно подключено при создании ячейки.Посмотрите на

-(void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier

https://developer.apple.com/documentation/uikit/uitableview/1614937-registernib

...