UITableViewCell detailTextLabel не отображается

Использование UITableView и его UITableViewCell (s) в Swift. У меня есть некоторая проблема, показывающая поле detailTextLabel a UITableViewCell.

Я уже нашел эти две полезные сообщения, но не смог получить полностью работоспособное решение: swift detailTextLabel не отображается Как установить UITableViewCellStyleSubtitle и dequeueReusableCell в Swift?

Вот код, который я использую, относящийся к моему вопросу:

override func viewDidLoad() {
    super.viewDidLoad()

………….
    theTableView = UITableView(frame: tmpFrame)
………….
    theTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "reuseIdentifier")
    theTableView.dataSource = self
    theTableView.delegate = self
    self.view.addSubview(theTableView)
}


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)
    cell.backgroundColor = UIColor.clearColor()
    cell.textLabel?.text = "THE-TEXT-LABEL"
    cell.detailTextLabel?.text = "KIJILO" // This does not show up.
    return cell
}

Когда я пытаюсь использовать поле detailTextLabel UITableViewCell, оно не отображается. Поиск в сети, я понимаю, что я должен использовать правильный стиль (UITableViewCellStyle) для ячейки, но я не вижу, как интегрировать это изменение в мой код. Примеры, которые я видел, основаны на подклассификации UITableViewCell, и я полагаю, что мне не нужно подклассифицировать UITableViewCell только для использования поля detailTextLabel. Скажите, пожалуйста, если я ошибаюсь.

Я также пробовал несколько вещей из сообщений, упомянутых выше, но ничего не работает, как я хочу.

Ответ 1

Вы зарегистрировали UITableViewCell

theTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "reuseIdentifier")

Это означает, что когда вы звоните

tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)

он будет автоматически создан для вас в стиле UITableViewCellStyleDefault.

Поскольку вам нужен собственный стиль, вам нужно сделать несколько вещей:

Удалить

theTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "reuseIdentifier")

Заменить

var cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)

со следующим

var cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier")
if cell == nil {
    cell = UITableViewCell(style: .Value1, reuseIdentifier: "reuseIdentifier")
}

То, что здесь происходит, - dequeueReusableCellWithIdentifier вернет ноль, если не сможет удалить из очереди ячейку. Затем вы можете создать собственную ячейку с указанным стилем.

Примечание: написал без Xcode, и я новичок в Swift, поэтому извиняюсь, если он не компилируется.

Ответ 2

Я обнаружил, что недостаточно проверить, является ли cell nil., я добавил эту дополнительную проверку:

var cell: UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier, for: indexPath)
if cell == nil || cell?.detailTextLabel == nil {
    cell = UITableViewCell(style: .subtitle, reuseIdentifier: cellReuseIdentifier)
}