Данные UITableViewCell не отображаются в UITableViewController - PullRequest
0 голосов
/ 21 января 2020

У меня проблемы с отладкой, почему мои данные ячейки UITableview не отображаются в UITableview. UITableview в настоящее время отображается пустым, когда пользователь переходит к нему. Данные правильно поступают в cellForRowAt и в функцию, которая устанавливает данные ячейки.

Установка данных ячейки

class EventInboxTableViewCell: UITableViewCell {

@IBOutlet weak var eventNameLabel: UILabel!
@IBOutlet weak var eventCoverImageView: UIImageView!
@IBOutlet weak var eventStartLabel: UILabel!
@IBOutlet weak var eventEndLabel: UILabel!

var eventStartString = String()
var eventEndString = String()

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
}

func setEvent(_ event:Event) {

    eventNameLabel?.text = event.eventName

    if event.eventStart != nil {
        let eventStartTS = event.eventStart
        let eventStartDate = eventStartTS?.dateValue()
        self.eventStartString = AppWideService.dateToStringShort(date: eventStartDate!)
    }

    if event.eventEnd != nil {
        let eventEndTS = event.eventEnd
        let eventEndDate = eventEndTS?.dateValue()
        self.eventEndString = AppWideService.dateToStringShort(date: eventEndDate!)
    }

    print("Event inbox event \(eventStartString)")
    print("Event inbox event \(eventEndString)")

    eventStartLabel?.text = self.eventStartString
    eventEndLabel?.text = self.eventEndString

    guard let urlString = event.eventCoverUrl as? String else { return  }
    let url = URL(string: urlString)
    guard url != nil else {
        //Couldn't create url object
        return
    }
    eventCoverImageView?.sd_setImage(with: url) { (image, error, cacheType, url) in
        self.eventCoverImageView?.image = image
    }}}

По какой-то причине, когда я удаляю ? после установки текста метки он говорит, что значения типа eventName или eventStartString и c равны нулю, но у меня есть операторы print, которые гарантируют, что это не так.

UITableView Datasource

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return retrievedEvents.count
}

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "EventInboxTableViewCell", for: indexPath) as! EventInboxTableViewCell

    let event = retrievedEvents[indexPath.row]

    cell.setEvent(event)

    return cell
}

Зарегистрированная ячейка в viewDidLoad

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

1 Ответ

1 голос
/ 21 января 2020

Проблема в том, как использовался контроллер табличного представления.

Если вы разрабатываете контроллер представления (любого типа) в раскадровке и хотите использовать его, вы не можете просто сказать:

let vc = EventInboxTableViewController()

Вы должны создать его экземпляр из раскадровки:

if let vc = storyboard?.instantiateViewController(withIdentifier: "EventInboxTableViewController") as? EventInboxTableViewController {
    navigationController?.pushViewControllerFromLeft(controller: vc)
}

Итак, в раскадровке назначьте свой пользовательский класс для UITableViewController и обязательно заполните Поле Storyboard ID (со строкой, которую вы используете в коде в качестве идентификатора).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...