Я пытаюсь скопировать встроенное приложение Apple Reminders. В нем есть два типа ячеек: один для отображения элемента напоминания, а другой для добавления нового элемента: Я не использую 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.