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 永不返回零的主要内容,如果未能解决你的问题,请参考以下文章