无法从UITableViewCell转换为指定的类型

时间:2016-02-17 18:11:49

标签: ios objective-c swift uitableview

我正在将一个应用程序从objective-c转换为swift。我没有写目标c代码。代码的功能之一如下......

func tableView (tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cellIdentifier: String = "Cell"

    var cell: ListCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier)!               

并且函数中有更多代码,但我认为它不相关。当我运行应用程序时,我收到错误:"nil found while unwrapping an optional"在我创建变量cell的行。发生错误是因为我尝试将UITableViewCell转换为ListCell类型。转换正在发生并且返回零。我需要在代码中包含这一行,因为它存在于app的objective-c版本中。

有没有什么方法可以解决这个问题并将UITableViewCell转换为ListCell而转换失败并返回nil?

以下是ListCell类的声明......

@interface ListCell : UITableViewCell {
    //code
}

我没有将ListCell类转换为swift,而是使用桥接头。 ListCell也是UITableViewCell的子类,为什么转换不起作用。

4 个答案:

答案 0 :(得分:0)

应该是

var cell:ListCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier)as!的ListCell

答案 1 :(得分:0)

试试这个,它应该可以正常工作。

func tableView (tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
 { 
let cellIdentifier: String = "Cell" 
var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! ListCell

答案 2 :(得分:0)

您应该使用此版本:

let cell = tableView.dequeueReusableCellWithIdentifier("Cell",
    forIndexPath: indexPath) as! ListCell

带索引路径的dequeue方法版本永远不会返回nil(在需要时自动创建新单元格)。

强制转换as!使用非可选值成功,或者崩溃应用程序(在这种情况下,如果单元格实际上不是ListCell)。

答案 3 :(得分:0)

有两种方法可以使用dequeueReusableCellWithIdentifier - 最常见的“现代”方式是注册重用标识符,并在故事板中为您的单元格指定自定义类。您还可以使用UITableView方法registerClass:forCellReuseIdentifier以编程方式执行相同的操作。

tableview.registerClass(ListCell.self, forCellReuseIdentifier:"Cell")

在这种情况下,你会说

var cell=tableview.dequeueReusableCellWithIdentifier(cellIdentifier) as! ListCell 

您可以使用强制向下转换,因为您知道出列操作将返回相应类型的单元格(如果没有则会出现问题并抛出异常,以便您可以对其进行调试)。

“旧”方式不是注册课程并处理dequeueReusableCellWithIdentifier可能返回nil的事实 - 在这种情况下,您需要自己分配一个新单元格;

var cell:Listcell

if let reuseCell = tableview.dequeueReusableCellWithIdentifier(cellIdentifier) as? ListCell {
    cell=reuseCell
} else {
    cell=ListCell(style: .Default, reuseIdentifier: cellIdentifier)
}
//  Now you can configure cell...