Swift tableView.dequeueReusableCell从不返回Nil

时间:2014-06-12 15:38:04

标签: ios uitableview swift

这是我生成表格视图的Swift代码。我正在尝试设置带有详细标签的tableView。问题是永远不会调用以下代码。

if (cell == nil) {
            println("1")
            cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "CellSubtitle")
            //cell = tableViewCell
        }

以下是该方法所需的代码:

    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
{
    println("start TableViewCellForRowAtIndexPath")
    var cell: UITableViewCell! = tableView.dequeueReusableCellWithIdentifier("CellSubtitle", forIndexPath: indexPath) as UITableViewCell
    if (cell == nil) {
        println("1")
        cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "CellSubtitle")
        //cell = tableViewCell
    }

    cell.textLabel.text = instructions[indexPath.row].text
    println("2")
    //cell.detailTextLabel
    cell.detailTextLabel.text = "HI"
    println("3")

以下是该方法的控制台输出:

start load
1
2
done load
start TableViewCellForRowAtIndexPath
2
fatal error: Can't unwrap Optional.None
(lldb) 

如何初始化detailTextLabel以插入文字?当我尝试设置标签的文本时,我会收到

fatal error: Can't unwrap Optional.None. 

为什么我收到此错误?

4 个答案:

答案 0 :(得分:6)

只要您注册了一个单元类以供重用,或者在Interface Builder中提供原型,您就不需要使用此出列方法检查单元格是否为nil。

let cell = tableView.dequeueReusableCellWithIdentifier("CellSubtitle", forIndexPath: indexPath) as! UITableViewCell

但是,如果要继续手动初始化单元格,则可以使用以下出列方法。 (请记住,这是旧的方式)

let cell = tableView.dequeueReusableCellWithIdentifier("CellSubtitle") as? UITableViewCell

然后,就初始化detailTextLabel而言,你不必这样做。它内置在单元格中,通过指定单元格的样式应该是副标题,将为您设置该标签。

请注意,Swift 2中不需要强制转换。

答案 1 :(得分:0)

  

重要

     

在调用此方法之前,必须使用寄存器(:forCellReuseIdentifier :)或注册(:forCellReuseIdentifier :)方法注册类或nib文件。

正如Apple的类引用所示,你需要在调用$cell方法之前注册自定义单元格的类。我假设对象为零的原因是你没有&#39 ; t注册吗?

答案 2 :(得分:0)

我今天遇到了这个问题。我通过删除注册方法来摆脱它

例如


tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellIdentifier)

答案 3 :(得分:-1)

尝试使用此

var cell: UITableViewCell! = tableView.dequeueReusableCellWithIdentifier("CellSubtitle", forIndexPath: indexPath) as UITableViewCell
if (cell == nil) {
cell = let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "CellSubtitle")
}

cell.textLabel.text = instructions[indexPath.row].text
cell.detailTextLabel?.text = "HI"