> -[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:] 中的断言失败的主要内容,如果未能解决你的问题,请参考以下文章