【问题标题】:Could not cast value of type 'UITableViewCell' to 'AppName.CustomCellName'无法将“UITableViewCell”类型的值转换为“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
    }
}

请帮忙。

【问题讨论】:

标签: ios xcode uitableview swift2


【解决方案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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多