无法将“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”
玩转web之json---将表单通过serialize()方法获取的值转成json
[C++]jsoncpp中将整个Json::Value转成std::string或者把里面值转成string类型