无法将“UITableViewCell”类型的值转换为“AppName.CustomCellName”

时间:2015-10-30 12:47:37

标签: ios xcode uitableview swift2

我正在尝试创建一个可自动扩展的自定义单元格。我正在使用这个github示例:https://github.com/rcdilorenzo/Cell-Expander

这一行给出了运行时错误SIGABRT:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    (cell as! EventTableViewCell).watchFrameChanges()
    //Could not cast value of type 'UITableViewCell' (0x105aa1b80) to 'AppName.EventTableViewCell' (0x104287fe0).
}

我也检查了这篇文章的回答,接着是三个步骤,但没有运气: Could not cast value of type 'UITableViewCell' to '(AppName).(CustomCellName)'

我的自定义单元格类如下所示:

import UIKit

class EventTableViewCell : UITableViewCell {
...
}

的cellForRowAtIndexPath:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier( "eventCell", forIndexPath: indexPath)

    let date = self.eventArray[indexPath.row].startTime
    let calendar = NSCalendar.currentCalendar()
    let minutes = calendar.component(NSCalendarUnit.Minute, fromDate: date)
    var minutesString: String
    if (minutes == 0) {
        minutesString = "00"
    } else {
        minutesString = String(calendar.component(NSCalendarUnit.Minute, fromDate: date))
    }
    let hours = calendar.component(NSCalendarUnit.Hour, fromDate: date)
    cell.textLabel?.text = self.eventArray[indexPath.row].title + " - \(hours):\(minutesString)"

    return cell
    }
}

请帮忙。

4 个答案:

答案 0 :(得分:17)

“我的viewDidLoad中有self.tableView.registerClass(UITableViewCell.self,forCellReuseIdentifier:”eventCell“)”

这可能会覆盖您在故事板中设置的值。请尝试删除此行,或将其更改为 if (this.Customers.Count == 1) { SelectedCustomer = Customers[0]; CustomerBoxText = SelectedCustomer.AccountCode; }

答案 1 :(得分:2)

在故事板中,单击单元格并将类名设置为EventTableViewCell而不是UITableViewCell

或者,如果您以编程方式执行所有操作,请在cellForRowAtIndexPath中执行此操作:

 var cell : EventTableViewCell?
 cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! EventTableViewCell?
 if cell == nil {
           cell = EventTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "eventCell")
 }
return cell

答案 2 :(得分:1)

您确定您获得的单元格是EventTableViewCell的实例吗?您是否使用registerClass:forCellReuseIdentifier:注册自定义单元格类?

如果您更改了以下代码:

(cell as! EventTableViewCell).watchFrameChanges()

到此:

(cell as? EventTableViewCell)?.watchFrameChanges()

你还得到例外吗?

另外,您使用GitHub示例中的相同故事板吗?如果是这样,您是否更新了故事板以使用您的单元类名称并重用标识符?您正在使用EventTableViewCell /" eventCell"但原始代码使用了PickerTableViewCell /" cell"。

答案 3 :(得分:1)

正如@Greg Brown所说,解决方案是将单元格的类型更改为自定义单元格类:

//wrong:
self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "eventCell") 

//right:
self.tableView.registerClass(EventTableViewCell.self, forCellReuseIdentifier: "eventCell")