如何正确地在代码中出现字幕UITableViewCell?

时间:2017-01-11 21:35:55

标签: swift uitableview swift3

我正在尝试使用纯代码中的常规非自定义.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单元格?

3 个答案:

答案 0 :(得分:3)

我测试了它并且它有效。我以为你想要继承Group-Object,但在这种情况下你不必注册单元格。

UItableViewCell

enter image description here

答案 1 :(得分:2)

我认为您的问题可能是您在界面构建器(或viewDidLoad)中注册了一个与' cellIdentifier'同名的单元格。 如果要使用字幕类型单元格,则不应注册任何单元格。通过注册一个单元格,它将首先尝试创建该单元格(这不是字幕类型的单元格)。

答案 2 :(得分:0)

我曾经遇到过类似的问题,并且发现最优雅的方法是如果不使用情节提要,则可以继承UITableViewCell。然后使用该自定义类使单元出队。

两个步骤:

  1. 创建字幕单元:

     class DetailCell: UITableViewCell {
    
        override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
     super.init(style: .subtitle, reuseIdentifier: "reuseIdentifier")
    
    }
    
     required init?(coder: NSCoder) {
     super.init(coder: coder)
     }
    
    }
    
  2. 出队单元可以选择将其强制转换为此类:

     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
    
     }