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”协议?