我正在尝试使用纯代码中的常规非自定义.subtitle
单元格创建UITableView。但是,以下代码从未向我提供具有正确detailTextLabel
的单元格,而是选择.default
单元格。
public var cellIdentifier: String { return "wordsCell" }
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: UITableViewCell
if let newCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) {
// Always succeeds, so it never goes to the alternative.
cell = newCell
}
else {
// This is never reached.
cell = UITableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier)
}
let word = wordAtIndexPath(indexPath: indexPath)
cell.textLabel?.text = word.text
cell.detailTextLabel?.text = word.subText
return cell
}
这很明显,因为dequeueReusableCell(withIdentifier:)
实际上并没有返回nil
,即使当前没有可用的单元格也是如此。相反,如果没有创建单元格,它总是返回.default
。
另一个选项,dequeueReusableCell(withIdentifier:for:)
也总是成功,所以这也不起作用。
到目前为止,在纯代码中创建非.default
样式单元格似乎是不可能的,没有Interface Builder来定义原型单元格的样式。我能提出的最接近的是answer,它注意到同样的问题。我发现的所有其他问题也解决了IB问题或自定义单元格。
有没有人知道如何在不使用Interface Builder的情况下为表格视图出列.subtitle
单元格?
答案 0 :(得分:3)
答案 1 :(得分:2)
我认为您的问题可能是您在界面构建器(或viewDidLoad
)中注册了一个与' cellIdentifier'同名的单元格。
如果要使用字幕类型单元格,则不应注册任何单元格。通过注册一个单元格,它将首先尝试创建该单元格(这不是字幕类型的单元格)。
答案 2 :(得分:0)
我曾经遇到过类似的问题,并且发现最优雅的方法是如果不使用情节提要,则可以继承UITableViewCell。然后使用该自定义类使单元出队。
两个步骤:
创建字幕单元:
class DetailCell: UITableViewCell {
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: .subtitle, reuseIdentifier: "reuseIdentifier")
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
}
出队单元可以选择将其强制转换为此类:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as? DetailCell else {
return UITableViewCell.init(style: .subtitle, reuseIdentifier: "reuseIdentifier")
}
// Configure the cell...
cell.textLabel?.text = "Title"
cell.detailTextLabel?.text = "Subtitle"
return cell
}