Как добавить subView для всех ячеек UITable - PullRequest
0 голосов
/ 06 февраля 2019

Без использования раскадровки.

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

Я создал этот viewLabel для повторного использования:

struct Label {
    static let errorLabel: UILabel = {
        let label = UILabel()
        label.frame = CGRect(x: 0, y: 0, width: 18, height: 18)
        label.text = "!"
        label.layer.cornerRadius = label.frame.height / 2
        label.backgroundColor = UIColor.red
        label.translatesAutoresizingMaskIntoConstraints = false
        label.textAlignment = .center
        label.textColor = UIColor.white
        label.font = UIFont(name: "CircularStd-Black", size: 14)
        label.clipsToBounds = true
        return label
    }()
}

Внутри cellForRowAt:

// I'm using detailTextLabel
let cell = UITableViewCell(style: .value1, reuseIdentifier: cellId)
cell.addSubview(Label.errorLabel)
// [...] constraints for Label.errorLabel
return cell

Исходя из этого примера, я ожидал бы показать красный кружок на всех ячейках, но вместо этого он показывает на последней ячейке.Почему?

1 Ответ

0 голосов
/ 06 февраля 2019

Несколько вещей здесь не так:

  1. Вы должны только добавить в ячейку contentView.(https://developer.apple.com/documentation/uikit/uitableviewcell/1623229-contentview)

Пример:

cell.contentView.addSubview(myLabel)

Лучше было бы повторно использовать ярлык один раз.Это можно сделать в конструкторе интерфейсов или init или awakeFromNib.Этот способ повторного использования будет более эффективным.

И это основная проблема, которую вы видите :

Вы являетесьдобавление одна статическая метка, снова и снова.

Значение: ее будет отображать только последняя ячейка, потому что есть только одна метка (:

Лучше использовать функцию для созданияэтикетка (заводская функция)

static func createLabel() -> UILabel {
  let label = UILabel()
        label.frame = CGRect(x: 0, y: 0, width: 18, height: 18)
        label.text = "!"
        label.layer.cornerRadius = label.frame.height / 2
        label.backgroundColor = UIColor.red
        label.translatesAutoresizingMaskIntoConstraints = false
        label.textAlignment = .center
        label.textColor = UIColor.white
        label.font = UIFont(name: "CircularStd-Black", size: 14)
        label.clipsToBounds = true
        return label
}
...