Я минимизирую свой контроллер представления, поэтому он имеет дело только с взаимодействиями с пользователем и оставляет обработку данных и манипулирование отдельным классом модели данных.
Я не получаю никаких текстовых значений пользовательских меток ячеек при запуске приложения. Мой метод cellForRowAt:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(forIndexPath: indexPath) as WordCustomCell
let viewModel = WordViewModel(tableViewWord: tableViewWords[indexPath.row], selectedCell: selectedCells[indexPath.row], isEdit: isEditCell)
cell.setUpWith(viewModel)
return cell
}
, и мой пользовательский класс ячейки:
class WordCustomCell: UITableViewCell {
@IBOutlet weak var englishWord: UILabel?
@IBOutlet weak var foreignWord: UILabel?
@IBOutlet weak var wordCheckmark: UIButton?
@IBOutlet weak var buttonLeft: NSLayoutConstraint?
var isCellTypeEditing:Bool = false
var isConstraintUpdated:Bool = false
let wordVC = WordsViewController()
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
func setcellType(cellType:cellType) {
switch cellType {
case .cellTypeEditing:
self.isCellTypeEditing = true
case .cellTypeNonEditing:
self.isCellTypeEditing = false
}
}
override func updateConstraints() {
super.updateConstraints()
switch isCellTypeEditing {
case true:
print("isCellTypeEditing in updateConstraints in LanguageCustomCell is: \(isCellTypeEditing)")
self.buttonLeft?.constant = 10
case false:
print("isCellTypeEditing in updateConstraints in LanguageCustomCell is: \(isCellTypeEditing)")
self.buttonLeft?.constant = -30
}
}
func setUpWith(_ viewModel: WordViewModel) {
print("viewModel.englishWordTitle in setUpWith in WordCustomCell is: \(viewModel.englishWordTitle)")
englishWord?.text = viewModel.englishWordTitle
print("viewModel.foreignWordTitle in setUpWith in WordCustomCell is: \(viewModel.foreignWordTitle)")
foreignWord?.text = viewModel.foreignWordTitle
let selectedCell = viewModel.selectedCell
let isEditCell = viewModel.isEdit
if isEditCell == true {
wordCheckmark?.isHidden = false
UIView.animate(withDuration: 0.5, animations: {
self.setcellType(cellType: .cellTypeEditing)
self.setNeedsUpdateConstraints()
self.wordVC.view.layoutIfNeeded()
}, completion: { (true) in
})
print("if selectedCell in tableView(cellForRowAt) in LanguagesViewcontroller is: \(selectedCell)")
if selectedCell{
wordCheckmark?.setImage(UIImage.init(named: "checked"), for: UIControl.State.normal)
//cell?.layer.backgroundColor = UIColor(red: 0.5, green: 0.5, blue: 0.5, alpha: 1.0).cgColor
} else {
wordCheckmark?.setImage(UIImage.init(named: "unchecked"), for: UIControl.State.normal)
}
wordCheckmark?.contentEdgeInsets = UIEdgeInsets.init(top: 5, left: 5, bottom: 5, right: 5)
foreignWord?.text = ""
wordVC.enableClear()
} else {
wordVC.tableView?.allowsMultipleSelection = false
wordCheckmark?.isHidden = false
wordCheckmark?.setImage(UIImage.init(named: "dot"), for: UIControl.State.normal)
wordCheckmark?.contentEdgeInsets = UIEdgeInsets.init(top: 10, left: 10, bottom: 10, right: 10)
setcellType(cellType: .cellTypeNonEditing)
//cell?.layer.backgroundColor = UIColor.white.cgColor
setNeedsUpdateConstraints()
wordVC.view.layoutIfNeeded()
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Я также создал протокол, который позволяет повторное использование ячейки без необходимости жесткого кодирования повторного использования ячейки. идентификатор в контроллере представления. Просто чтобы сделать новые контроллеры представления проще и проще добавлять по мере развития приложения в будущем.
import Foundation
import UIKit
//1 protocol declaration
protocol Reusable {}
//2 protocol extension
extension Reusable where Self: UITableViewCell {
static var reuseIdentifier: String {
return String(describing: self)
}
}
//3 conforming to protocol
extension UITableViewCell: Reusable {}
//4 using generics to make code reusable
extension UITableView {
func register<T: UITableViewCell>(_ :T.Type) {
register(T.self, forCellReuseIdentifier: T.reuseIdentifier)
}
func dequeueReusableCell<T: UITableViewCell>(forIndexPath indexPath: IndexPath) -> T {
guard let cell = dequeueReusableCell(withIdentifier: T.reuseIdentifier, for: indexPath) as? T else {
fatalError("Could not deqeue cell")
}
return cell
}
}
Я сделал все обычные регистрации пользовательских ячеек представления таблицы (как вы можете видеть в контроллере представления viewDidLoad ), и у меня есть все соединения построителя интерфейса раскадровки. Он работал до того, как я начал минимизировать контроллер представления, и я не изменил ни одной опции раскадровки, так как она работала.