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

Posted

技术标签:

【中文标题】无法将“UITableViewCell”类型的值转换为“AppName.CustomCellName”【英文标题】:Could not cast value of type 'UITableViewCell' to 'AppName.CustomCellName' 【发布时间】:2015-10-30 12:47:37 【问题描述】:

我正在尝试创建一个可在点击时展开的自定义单元格。我正在使用这个 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
    

请帮忙。

【问题讨论】:

显示方法 cellForRowAtIndexPath 的代码 @MobileMon 编辑了问题^ Could not cast value of type 'UITableViewCell' to '(AppName).(CustomCellName)'的可能重复 【参考方案1】:

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

这可能会覆盖您在情节提要中设置的值。尝试删除此行,或将其更改为 self.tableView.registerClass(EventTableViewCell.self, forCellReuseIdentifier: "eventCell")

【讨论】:

我正在以编程方式制作我的表格视图,而不是在 registerClass 方法中设置自定义单元格名称是导致我出错的原因。【参考方案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

【讨论】:

【参考方案3】:

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

如果您从此更改代码:

(cell as! EventTableViewCell).watchFrameChanges()

到这里:

(cell as? EventTableViewCell)?.watchFrameChanges()

你仍然得到异常吗?

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

【讨论】:

我的 viewDidLoad 中有 self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "eventCell"),而 eventCell 是情节提要中的标识符。它确实与注册单元格有关,因为您的代码有效,但是当我尝试拖动单元格(其他函数)时,我得到同样的错误:无法将类型“UITableViewCell”(0x10d29eb80)的值转换为“CallIn.EventTableViewCell 我没有使用相同的故事板,我使用的是我的,我已经适应了。 如果您在storyboard中定义了“eventCell”,我认为您不需要在代码中显式注册它。您为情节提要中的单元格设置了什么类型?是 EventTableViewCell 吗? 如果您不使用情节提要,您是否使用的是 xib? "我有 self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "eventCell")" - 尝试删除此行,或将其更改为 self.tableView.registerClass(EventTableViewCell.self, forCellReuseIdentifier: "eventCell")【参考方案4】:

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

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

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

【讨论】:

以上是关于无法将“UITableViewCell”类型的值转换为“AppName.CustomCellName”的主要内容,如果未能解决你的问题,请参考以下文章

无法将“UITableViewCell”(0x11e159aa0)类型的值转换为“test.CourseItemTableViewCell”

js中由var获取的值转转换为long值

玩转web之json---将表单通过serialize()方法获取的值转成json

[C++]jsoncpp中将整个Json::Value转成std::string或者把里面值转成string类型

[C++]json cpp中将整个Json::Value转成std::string或者把里面值转成string类型

无法将UITextField中的值作为子视图返回到UITableViewCell中的UILabel