Как создать пользовательские ячейки на 100% программно в Swift? - PullRequest
1 голос
/ 10 октября 2019

Я пытаюсь построить TableView программно, но не могу отобразить стандартную метку;я вижу только пустые клеткиВот мой код:

Ячейка TableView:

class TableCell: UITableViewCell {

    let cellView: UIView = {
       let view = UIView()
        view.backgroundColor = .systemRed
        return view
    }()

    let labelView: UILabel = {
        let label = UILabel()
        label.text = "Cell 1"
        return label
    }()

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setup()
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func setup() {
        addSubview(cellView)
        NSLayoutConstraint.activate([
            cellView.topAnchor.constraint(equalTo: topAnchor),
            cellView.bottomAnchor.constraint(equalTo: bottomAnchor),
            cellView.leadingAnchor.constraint(equalTo: leadingAnchor),
            cellView.trailingAnchor.constraint(equalTo: trailingAnchor)])
        cellView.addSubview(labelView)
    }
}

Источник данных:

class TableDataSource: NSObject, UITableViewDataSource {
    let cellID = "cell"

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! TableCell
        return cell
    }
}

А это VC:

class TableViewController: UITableViewController {

    let dataSource = TableDataSource()

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.register(TableCell.self, forCellReuseIdentifier: dataSource.cellID)
        tableView.dataSource = dataSource
    }
}

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

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Я вижу несколько ошибок в вашей ячейке.

  1. Добавление подпредставлений в contentView, а не непосредственно в ячейку:

    contentView.addSubview(cellView)
    cellView.addSubview(labelView)
    

    То же самое необходимо для ограничений:

    NSLayoutConstraint.activate([
        cellView.topAnchor.constraint(equalTo: contentView.topAnchor),
        cellView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
        cellView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
        cellView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor)
    ])
    
  2. Для представлений, созданных в коде, необходимо установить translatesAutoresizingMaskIntoConstraints = false,

    let cellView: UIView = {
       let view = UIView()
        view.backgroundColor = .systemRed
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()
    
    let labelView: UILabel = {
        let label = UILabel()
        label.text = "Cell 1"
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()
    
  3. Нет ограничений для вашего ярлыка.
1 голос
/ 10 октября 2019

Ваши ограничения не работают, потому что вам нужно изменить translatesAutoresizingMaskIntoConstraints на cellView в вашем setup():

    func setup() {
        addSubview(cellView)
        cellView.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            cellView.topAnchor.constraint(equalTo: topAnchor),
            cellView.bottomAnchor.constraint(equalTo: bottomAnchor),
            cellView.leadingAnchor.constraint(equalTo: leadingAnchor),
            cellView.trailingAnchor.constraint(equalTo: trailingAnchor)])
        cellView.addSubview(labelView)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...