> -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:] 中的断言失败

Posted

技术标签:

【中文标题】> -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:] 中的断言失败【英文标题】:Assertion failure in > -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:] 【发布时间】:2015-05-18 03:28:10 【问题描述】:

我在尝试将 addSubView() 转换为 UITableViewCell 时收到此错误消息

错误信息

2015-05-18 11:26:46.048 xxxxx[1128:437863] * 中的断言失败 -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:], /SourceCache/UIKit/UIKit-3347.44/UITableView.m:6245 2015-05-18 11:26:46.053 DateTick[1128:437863] * 由于未捕获而终止应用程序 异常'NSInternalInconsistencyException',原因:'无法 使用标识符 AgeCell 出列一个单元格 - 必须注册一个 nib 或一个 标识符的类或连接故事板中的原型单元' *** 第一次抛出调用堆栈:(0x1856982d8 0x196ebc0e4 0x185698198 0x18654ced4 0x18a251e84 0x100094c20 0x100095070 0x18a3d9a68 0x18a3cd890 0x18a1b9268 0x18a0d5760 0x189a1de1c 0x189a18884 0x189a18728 0x189a17ebc 0x189a17c3c 0x189a11364 0x1856502a4 0x18564d230 0x18564d610 0x1855792d4 0x18ed8f6fc 0x18a13efac 0x1000c0a9c 0x19753aa08) libc++abi.dylib: 以未捕获的方式终止 NSException 类型的异常

我已经在 UITableViewCell 标识符中声明了 AgeCell

我的代码:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("AgeCell", forIndexPath: indexPath) as! UITableViewCell //1

        let slider =  RangeSlider(frame:cell.bounds)
        slider.minimumValue = 1;
        slider.selectedMinimumValue = 2;
        slider.maximumValue = 10;
        slider.selectedMaximumValue = 8;
        slider.minimumRange = 2;
        slider.addTarget(self, action:"updateRangeLabel", forControlEvents:UIControlEvents.ValueChanged)

        cell.addSubview(slider)
        return cell
    

P.S:顺便说一句,我的 UITableViewController 是静态单元格,而不是动态单元格。

【问题讨论】:

你search on the error了吗? 已经在 *** 中完成,仍然无法正常工作。发现这个错误已经 3 天了。 您是否按照错误说明进行操作?您是否使用标识符“AgeCell”注册了一个单元格(大小写很重要)? 【参考方案1】:

Swift 的语法是

let nib = UINib(nibName: "AgeCell", bundle: nil)
self.tableView.registerNib(nib, forCellReuseIdentifier:"AgeCell")

【讨论】:

【参考方案2】:

注意 dequeueReusableCellWithIdentifier: 和 dequeueReusableCellWithIdentifier:forIndexPath: 是不同的方法。

文档说:

重要提示:您必须使用 registerNib:forCellReuseIdentifier: 或 registerClass:forCellReuseIdentifier: 调用此方法之前的方法 方法。

Check out this Q&A.了解有关此主题的更多详细信息

在 swift 中注册一个 NIB:

UINib nib = UINib.nibWithNibName("AgeCell", bundle:nil);
self.tableView.registerNib(nib, forCellReuseIdentifier:"AgeCell");

【讨论】:

【参考方案3】:

您需要使用 UITableView 注册您的单元格的笔尖。这样,UITableView 将知道您的重用标识符"AgeCell" 与单元格匹配。您通常在 viewDidLoad 中为您的视图控制器执行此操作。

在目标 C 中:

-(void)viewDidLoad 
    [super viewDidLoad];

    UINib * nib = [UINib nibWithNibName:@"AgeCell" bundle:nil];
    [self.tableView registerNib:nib forCellReuseIdentifier:@"AgeCell"];

在斯威夫特中:

override func viewDidLoad() 
    super.viewDidLoad()

    let nib = UINib(nibName: "AgeCell", bundle: nil)
    self.tableView.registerNib(nib, forCellReuseIdentifier:"AgeCell")

【讨论】:

你确定 UINib nib = UINib.nibWithNibName("AgeCell", bundle:nil); ?很快吗? 我已经修复了 Swift 语法,感谢@Joped 的更正。【参考方案4】:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cellIdentifier = "itemTableViewCell"
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! itemTableViewCell

        let item = items[indexPath.row]

        cell.nameLabel.text = item.name

        return cell
    

【讨论】:

以上是关于> -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:] 中的断言失败的主要内容,如果未能解决你的问题,请参考以下文章

爬取天堂图片网图片并存储

php将获取的数组变成字符串传入txt文本。。。

dvd管理系统

爬取腾讯社招职位信息

爬取腾讯社招职位信息

笔记 10 11 13