Ну, проблема в том, что ваше решение неверно на нескольких уровнях. Решение Pierce, будучи лучше разложенным, также ошибочно.
Понимаете, проблема заключается в том, что вы добавляете новое subview каждый раз, когда вы деактивируете ячейку, но вы никогда не удаляете subview из иерархии. Это означает, что у вас есть несколько подъячейков, укладывающих один поверх другого.
Во-вторых, вы должны обязательно использовать автоспуск, так как ваша камера не будет выглядеть хорошо на разных устройствах.
В-третьих, использование силовых передач - это короткий путь к сбоям, когда вы начинаете что-то менять. Избегайте их любой ценой, используя вместо этого чистый вариант.
Последнее, но не менее важное, я рекомендую использовать Interface Builder для создания макета представления и иерархии.
Что касается решения, ваше решение будет намного лучше, если вы создали мобильный подкласс следующего вида:
class CustomTableViewCell: UITableViewCell {
var titleLabel: UILabel? {
didSet {
titleLabel.map { self.addSubview($0) }
oldValue?.removeFromSuperview()
}
}
override func awakeFromNib() {
super.awakeFromNib()
let label = UILabel(frame: CGRect(x: 45,y: 2,width: 100,height: 20))
label.textAlignment = NSTextAlignment.left
label.font = UIFont(name: "Swiss721BT-Roman", size: 16)
self.titleLabel = label
}
}
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 100
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
if let cell = cell as? CustomTableViewCell {
cell.titleLabel?.text = "Title"
}
return cell
}
}
Однако, чтобы улучшить его еще больше, я рекомендовал бы использовать что-то, как IDPCastable cocoapod
это позволило бы упростить согласование без силы бросает:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
return match(cell) { (c: CustomTableViewCell) in
c.titleLabel?.text = "Title"
}
}
И, позвольте мне еще раз подчеркнуть, интерфейс строитель способ пойти и автоспуск - это абсолютно необходимо.
Почему бы не создать пользовательский подкласс 'UITableViewCell'? – Pierce