UITableViewDataSource 导致 libc++abi.dylib:以 NSException 类型的未捕获异常终止

Posted

技术标签:

【中文标题】UITableViewDataSource 导致 libc++abi.dylib:以 NSException 类型的未捕获异常终止【英文标题】:UITableViewDataSource causing libc++abi.dylib: terminating with uncaught exception of type NSException 【发布时间】:2016-12-22 12:01:41 【问题描述】:

我有一个包含 UITableView 的 ViewController:

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 声明。

但我不知道如何解决它,我尝试设置标识符并为单元格分配类。

【问题讨论】:

放置异常断点以获取导致错误的行。 为什么//as! RestaurantMapTableViewCell发表评论? 那是错误的。我已经编辑过了。 UserBusinesses 类或returnedBusinesses 数组为零。 它们不是零。它们已在上一个活动中实例化 【参考方案1】:

您的代码看起来不错,所以我提供了一种方法来帮助查找问题。

首先,在句子上打断点:

return UserBusinesses.returnedBusinesses.count

检查returnBusinesses 是否为nil。如果本次检查通过,继续第二次检查,在语句上打断点:

let cell = tableView.dequeueReusableCell(...

使用这个按钮一步一步执行,直到崩溃的那句:

正常,步骤会帮你找到问题。

如果问题出在“let cell = tableView.dequeueReusableCell”这句话上,你可能会忘记设置cell的标识符:

或者忘记设置自定义类:

【讨论】:

我刚试过。问题在于let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) as! RestaurantMapTableViewCell 但设置标识符或类并不能解决问题。它们已经就位了。 尝试删除“as!RestaurantMapTableViewCell”。如果之后进展顺利,则问题出在单元格 Xib 中。检查cell中的IBOutlets,或者在cell初始化方法中打断点找出来。 谢谢,问题出在笔尖 let nib = UINib(nibName: "RestaurantMapTableViewCell", bundle: nil) self.tableView.register(nib, forCellReuseIdentifier:"RestaurantMapTableViewCell") 我删除了这些行,代码开始正常工作。 @SaadQureshi,有趣!有没有把 Cell 在 Storyboard 的 TableView 中,注册另一个 XIB 文件? 我也遇到了同样的问题。这是由我的自定义单元类的代码的出口损坏引起的。我已经创建了一个从标签到自定义单元类的出口,改变了主意并在我的代码中删除了出口,但我忘记了从情节提要中删除它。当我这样做时,崩溃就消失了。【参考方案2】:

重新检查上面云辰指出的,如果再次失败,请验证heightforrow方法。如果您在非自动布局单元格上使用自动尺寸标注,它会在加载时崩溃。

【讨论】:

以上是关于UITableViewDataSource 导致 libc++abi.dylib:以 NSException 类型的未捕获异常终止的主要内容,如果未能解决你的问题,请参考以下文章

关于视图的 Swift 未确认协议“UITableViewDataSource”

UITableView 和 UITableViewDataSource

Swift 3 UITableViewDataSource 选择器

ViewController 未确认协议“UITableViewDataSource”

类型“ViewController”不符合协议“UITableViewDataSource”

viewcontroller 是不是符合“UITableViewDataSource, Video Mode Delegate”协议?