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

时间:2015-05-18 03:28:11

标签: ios uitableview swift xcode6

尝试addSubView()进入UITableViewCell

时收到此错误消息

错误消息

  

2015-05-18 11:26:46.0​​48 xxxxx [1128:437863] *断言失败    - [UITableView dequeueReusableCellWithIdentifier:forIndexPath:],/ SourceCache / UIKit / UIKit-3347.44 / UITableView.m:6245 2015-05-18   11:26:46.0​​53 DateTick [1128:437863] * 由于未被捕获而终止应用   异常'NSInternalInconsistencyException',原因:'无法   将具有标识符AgeCell的单元格出列 - 必须注册一个笔尖或一个   标识符的类或连接故事板中的原型单元格'   ***首先抛出调用堆栈:(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类型的异常

我已在AgeCell标识符

中声明UITableViewCell

enter image description here

我的代码:

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:BTW我的UITableViewController是静态单元格,而不是动态单元格。

4 个答案:

答案 0 :(得分:3)

Swift的语法是

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

答案 1 :(得分:1)

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

文档说:

  

重要说明:您必须使用以下命令注册类或nib文件   registerNib:forCellReuseIdentifier:或   registerClass:forCellReuseIdentifier:调用它之前的方法   方法

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

在swift中注册NIB:

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

答案 2 :(得分:0)

您需要使用UITableView注册单元格的笔尖。这样,UITableView就会知道您的reuseIdentifier "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")
}

答案 3 :(得分:0)

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
    }