Swift tableView.dequeueReusableCell 永不返回零

Posted

技术标签:

【中文标题】Swift tableView.dequeueReusableCell 永不返回零【英文标题】:Swift tableView.dequeueReusableCell Never Returning Nil 【发布时间】:2014-06-12 15:38:03 【问题描述】:

这是我生成表格视图的 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. 

为什么我会收到这个错误?

【问题讨论】:

【参考方案1】:

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

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

但是,如果您想继续手动初始化单元格,则可以改用以下 dequeue 方法。 (记住,这是老办法)

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

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

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

【讨论】:

请查看更新后的问题。即使像您所说的那样更改方法后,当我将文本设置为 detailTableView 时,我仍然收到错误 fatal error: Can't unwrap Optional.None @jbman223 你在指令数组中存储了什么样的对象? 指令是一个自定义对象,用于保存文本、详细文本和图像以及其他信息的数据。 您展示的第二种方式,使用较旧的 dequeue 方法也不会返回 nil 单元格,如果单元格是在情节提要中制作的(假设标识符是正确的)。 开始获取它:) 所以在不同的图像取决于单元格索引的情况下,这个 imageView 将是单元格子类的“出口”,或者我只会在 cellForRowAtIndexPath 中声明它? 【参考方案2】:

重要

在调用此方法之前,您必须使用 register(:forCellReuseIdentifier:) 或 register(:forCellReuseIdentifier:) 方法注册一个类或 nib 文件。

正如Apple的类引用所说,您需要在调用dequeueReusableCell(withIdentifier:for:)方法之前注册自定义单元格的类。我认为该对象为nil的原因是您没有注册它?

【讨论】:

【参考方案3】:

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

例如。


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

【讨论】:

【参考方案4】:

试试这个

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"

【讨论】:

这里的单元格永远不会为零。

以上是关于Swift tableView.dequeueReusableCell 永不返回零的主要内容,如果未能解决你的问题,请参考以下文章

Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift

swift 示例BS swift.swift

swift swift_bug.swift

ios 整理(一)swift和oc的区别

swift swift_extension5.swift

swift swift_optional4.swift