Повторное использование кода макета для UITableViewCell аналогичного макета - PullRequest
1 голос
/ 11 января 2020

Я пытаюсь скопировать встроенное приложение Apple Reminders. В нем есть два типа ячеек: один для отображения элемента напоминания, а другой для добавления нового элемента: Reminders table view cells Я не использую Interface Builder, поэтому весь код макета содержится в UITableViewCell подкласс. Здесь я создал один элемент для ячейки напоминания:

class ItemCell: UITableViewCell {
    var leftButton: UIButton!
    var middleLabel: UILabel!

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

        middleLabel = UILabel()
        middleLabel.translatesAutoresizingMaskIntoConstraints = false

        leftButton = UIButton(type: .custom)
        leftButton.translatesAutoresizingMaskIntoConstraints = false
        leftButton.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)

        contentView.addSubview(middleLabel)
        contentView.addSubview(leftButton)

        NSLayoutConstraint.activate([
            leftButton.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 8.0),
            leftButton.centerYAnchor.constraint(equalTo: contentView.centerYAnchor),
            middleLabel.leadingAnchor.constraint(equalTo: leftButton.trailingAnchor, constant: 8.0),
            middleLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: 8.0),
            middleLabel.centerYAnchor.constraint(equalTo: leftButton.centerYAnchor)
        ])
    }

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

Теперь, если бы мне пришлось создать еще один подкласс UITableViewCell для ячейки добавления элемента, большая часть кода его макета была бы такой же, за исключением того, что подпредставления были бы другого типа. Простейшее решение простого копирования и вставки фрагментов кода имеет очевидный недостаток: он не чистый, многоразовый и элегантный.

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

1 Ответ

1 голос
/ 11 января 2020

Создайте функцию, которая просто принимает UIViews в качестве параметров и создает макет.

Затем создайте базовый класс, производный от ячейки таблицы, и переместите эту функцию туда.

Наконец, измените этот класс на производный от нового базового класса

Теперь ваша новая ячейка также может быть производной от этого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...