UITableViewCell的例外。 EXC_BREAKPOINT,子代码= 0xdefe

时间:2014-08-19 11:56:57

标签: ios uitableview swift

我正在创建自定义UITableViewCell,而不使用IB或Storyboard。 UITableViewCell需要是Subtitle样式。 当我使用基类UITableViewCell时,我发现单元格具有默认样式而不是我需要的字幕样式。 我认为这是因为在tableview:cellforrowatindexpath中,方法dequeueReusableCellWithIdentifier返回一个默认类型的单元格,这可能是因为类UITableViewCell的init方法返回默认样式。

所以我决定继承UITableViewCell并在子类的init方法(MyTableViewCell)中,我将样式设置为Subtitle类型。

主要代码段如下:

class MyTableViewCell: UITableViewCell {

    override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
        super.init(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "CellSubtitle")
    }

    required init(coder aDecoder: NSCoder!) {
        super.init(coder: aDecoder)
    }
....
}

在tableviewcontroller中:

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> MyTableViewCell! {
        let cellIdentifier = "CellSubtitle"

        var cell = tableView!.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as MyTableViewCell!

        if cell == nil   {
            println("Cell is nil so creating a new one")
            cell = MyTableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: cellIdentifier)
        }

        // Configure the cell...
        if indexPath.row == 3 {
            cell.textLabel.text = " Some text"
            cell.detailTextLabel.text = " Some more text!"
        }
        return cell
    }

这似乎在将单元格出列时抛出异常,如下所示: (非常感谢任何指向根本原因的指针)

(lldb) bt
* thread #1: tid = 0x50b5f, 0x001de43e libswiftCore.dylib`swift_dynamicCastClassUnconditional + 26, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT, subcode=0xdefe)
  * frame #0: 0x001de43e libswiftCore.dylib`swift_dynamicCastClassUnconditional + 26
    frame #1: 0x00082754 swift2`swift2.MyTableViewController.tableView (tableView=Some, indexPath=Some, self=0x15e4d980)(Swift.ImplicitlyUnwrappedOptional<ObjectiveC.UITableView>, cellForRowAtIndexPath : Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSIndexPath>) -> Swift.ImplicitlyUnwrappedOptional<swift2.MyTableViewCell> + 1244 at MyTableViewController.swift:52
    frame #2: 0x000835c4 swift2`@objc swift2.MyTableViewController.tableView (swift2.MyTableViewController)(Swift.ImplicitlyUnwrappedOptional<ObjectiveC.UITableView>, cellForRowAtIndexPath : Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSIndexPath>) -> Swift.ImplicitlyUnwrappedOptional<swift2.MyTableViewCell> + 100 at MyTableViewController.swift:0
    frame #3: 0x3139e8f6 UIKit`-[UITableView _createPreparedCellForGlobalRow:withIndexPath:] + 410
    frame #4: 0x31345c26 UIKit`-[UITableView _updateVisibleCellsNow:] + 1806

编辑:如果我注释掉dequeueReusableCellWithIdentifier,则崩溃消失

2 个答案:

答案 0 :(得分:0)

在排队集合视图单元格时,我遇到了与swift_dynamicCastClassUnconditional相同的难以理解的错误的类似问题。其他人可能犯了同样的错误,所以这就是发生在我身上的事情:

在我的例子中,我有两个单元类,每个类都有一个xib和一个swift类。一个是另一个的子类,是导致崩溃的那个。最后我发现我已经从超类中复制了xib以添加部分 - 而且我无法将Interface Builder中Identity Inspector中的单元类从“超类”更改为“子类”。棘手的疏忽!但这解释了铸造误差......

答案 1 :(得分:-1)

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> MyTableViewCell! {
    //let cellIdentifier = "CellSubtitle"

    var cell = tableView!.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as MyTableViewCell!
 cell = MyTableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: cellIdentifier);

    if cell == nil   {
        println("Cell is nil so creating a new one");
 NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@" your CustomCellnib name" owner:nil options:nil];


    }

    // Configure the cell...
    if indexPath.row == 3 {
        cell.textLabel.text = " Some text"
        cell.detailTextLabel.text = " Some more text!"
    }
    return cell
}
and make sure that ur nib is a subclass of MyTableViewcell..in Storyboar or in IB