UITableViewDataSource, вызывающий libc++abi.dylib: завершение работы с необработанным исключением типа NSException

У меня есть ViewController, содержащий UITableView:

import UIKit
import GoogleMaps

class RestaurantMapViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var mapView: GMSMapView!
    @IBOutlet weak var tableView: UITableView!

    var cameraPosition: GMSCameraPosition!
    var zoomLevel: Double = 15

    override func viewDidLoad() {

        NotificationCenter.default.addObserver(self, selector: #selector(RestaurantMapViewController.updateEntries), name: NSNotification.Name(rawValue: "UpdateEntries"), object: nil)


        let nib = UINib(nibName: "RestaurantMapTableViewCell", bundle: nil)
        self.tableView.register(nib, forCellReuseIdentifier:"RestaurantMapTableViewCell")
        tableView.delegate = self
        tableView.dataSource = self
    }

    // MARK: Notifications

    @objc private func updateEntries() {

        DispatchQueue.main.async {
            self.tableView.reloadData()
            print("Data reloaded in Maps view")
        }
    } 

    // MARK: TableView methods

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print("Initiating in Cells Mapview")

        return UserBusinesses.returnedBusinesses.count
    }

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

        print("Writing in Cells Mapview")

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

        let business = UserBusinesses.returnedBusinesses[indexPath.row]

        cell.restaurantName.text = business.name
        cell.restaurantTags.text = business.tags
        cell.ratingControl.rating = Int(business.rating)


        return cell
    }

}

Все соединения в раскадровке настроены правильно.

Когда я запускаю этот код, он дает следующую ошибку:

введите здесь описание изображения

Однако, когда я удаляю протокол UITableViewDataSource, исключение исчезает.

Пожалуйста, дайте мне знать, как исправить исключение.

РЕДАКТИРОВАТЬ: я только что узнал, что исключение связано с оператором let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) as! RestaurantMapTableViewCell.

Но я не знаю, как это исправить, я попытался установить идентификатор и присвоить класс ячейке.


person Saad Qureshi    schedule 22.12.2016    source источник
comment
Поместите Exception Breakpoint, чтобы узнать, какая строка вызывает ошибку.   -  person Bhavin Ramani    schedule 22.12.2016
comment
Почему //as! RestaurantMapTableViewCell прокомментировал?   -  person Bista    schedule 22.12.2016
comment
Это было по ошибке. Я отредактировал его.   -  person Saad Qureshi    schedule 22.12.2016
comment
UserBusinesses или массив returnedBusinesses равен нулю.   -  person Lefteris    schedule 22.12.2016
comment
Они не нулевые. Они были созданы в предыдущем действии   -  person Saad Qureshi    schedule 22.12.2016


Ответы (2)


Ваш код выглядит хорошо, поэтому я помогу найти проблему.

Сначала установите точку останова в предложении:

return UserBusinesses.returnedBusinesses.count

Чтобы проверить, является ли returnBusinesses нулевым или нет. Если эта проверка пройдена, перейдите к Второй проверке, сделайте точку останова на предложении:

let cell = tableView.dequeueReusableCell(...

Используйте эту кнопку для выполнения шаг за шагом, пока предложение не вылетит: введите здесь описание изображения

Нормально, шаги помогут вам найти проблему.

Если проблема в предложении «let cell = tableView.dequeueReusableCell», вы можете забыть установить идентификатор ячейки:

введите здесь описание изображения

Или забудьте установить собственный класс: введите здесь описание изображения

person Yun CHEN    schedule 22.12.2016
comment
Я только что попробовал это. Проблема с let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) as! RestaurantMapTableViewCell Но установка идентификатора или класса не решает проблему. Они уже были на месте. - person Saad Qureshi; 23.12.2016
comment
Попробуй удалить как! РесторанMapTableViewCell. Если после этого все идет хорошо, проблема в ячейке Xib. Проверьте IBOutlets в ячейке или сделайте точки останова в методах инициализации ячейки, чтобы узнать это. - person Yun CHEN; 23.12.2016
comment
Спасибо, проблема была с пером let nib = UINib(nibName: "RestaurantMapTableViewCell", bundle: nil) self.tableView.register(nib, forCellReuseIdentifier:"RestaurantMapTableViewCell") Я удалил эти строки и код заработал нормально. - person Saad Qureshi; 23.12.2016
comment
@SaadQureshi, интересно! Вы поместили Cell в TableView в Storyboard и зарегистрировали другой файл XIB? - person Yun CHEN; 23.12.2016
comment
У меня была такая же проблема. Это было вызвано неработающим выходом к коду моего пользовательского класса ячеек. Я создал выход из метки в пользовательский класс ячеек, передумал и удалил выход в своем коде, и я забыл удалить его из раскадровки. Авария исчезла, когда я это сделал. - person ClayJ; 03.03.2018

После повторной проверки того, что указал Юнь Чен выше, если это снова не сработает, пожалуйста, проверьте метод heightforrow. Если вы используете autodimension для ячеек без автоматического макета, это приведет к сбою при загрузке.

person Medhi    schedule 26.11.2019