我正在创建自定义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,则崩溃消失
答案 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