我正在将一个应用程序从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
的子类,为什么转换不起作用。
答案 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...