#ios #swift #uitableview
#iOS #swift #uitableview
Вопрос:
У меня есть пользовательский подкласс UITableViewCell, показанный ниже
class GroupSelectionTableViewCell: UITableViewCell {
// MARK: - Properties
var groupSelectionLabel: UILabel = {
let label = UILabel()
label.textColor = .white
label.backgroundColor = .clear
label.font = UIFont.systemFont(ofSize: 18)
return label
}()
var groupSelectionImageView: UIImageView = {
let iv = UIImageView()
iv.backgroundColor = .clear
iv.setHeight(height: 25)
iv.setWidth(width: 25)
iv.contentMode = .scaleAspectFill
return iv
}()
// MARK: - LifeCycle
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
configureUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Helper Functions
private func configureUI() {
self.addSubview(groupSelectionLabel)
groupSelectionLabel.centerY(inView: self)
groupSelectionLabel.anchor(left: self.leftAnchor, paddingLeft: 12)
self.addSubview(groupSelectionImageView)
groupSelectionImageView.centerY(inView: self)
groupSelectionImageView.anchor(right: self.rightAnchor, paddingRight: 12)
self.backgroundColor = .black
self.selectionStyle = .none
}
}
и пользовательский подкласс UITableView, показанный ниже…
class GroupSelectionView: UITableView {
// MARK: - Properties
private let cellID = "GroupSelectionTableViewCell"
override init(frame: CGRect, style: UITableView.Style) {
super.init(frame: frame, style: style)
backgroundColor = .red
setHeight(height: 450)
setWidth(width: 300)
register(GroupSelectionTableViewCell.self, forCellReuseIdentifier: cellID)
rowHeight = 60
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension GroupSelectionView: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
return
}
}
extension GroupSelectionView: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
6
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! GroupSelectionTableViewCell
cell.groupSelectionLabel.text = "None"
cell.groupSelectionImageView.image = UIImage(named: "Tick")
return cell
}
}
Но когда я добавляю свой экземпляр table view в UIView() в качестве подвида, класс table view cell не запускает свой инициализатор. Правильно ли я использую метод register? Я попытался создать экземпляр подкласса table view и поместить оператор print в инициализатор подкласса table view cell, но он не печатается. Я забыл установить какое-либо свойство в подклассе table view? Нужно ли мне вместо этого использовать версию register в формате Nib? Буду признателен за любую помощь.
Комментарии:
1. Не связано с вашим вопросом, но
UITableViewCell.CellStyle
внутри метода экземпляра подкласса является избыточнымCellStyle
2. Кстати, я бы подкласс UITableViewController вместо UITableView
3. Это должно работать как дизайн. Но
cellForRow
даже вызывается? Если нет, то это может быть из-за отсутствия источника данных и / или из-за того, что его размер не виден (он не может отображать ячейку, поэтому он не будет вызывать cellForRowAt , который вызовет dequeueCell, который вызовет init(style:identifier))4. Но я хочу создать всплывающий модальный тип представления, выполнив view.addSubview (MyTableView)
5. @Larme
cellForRow
не вызывается
Ответ №1:
Забыл установить источник данных и делегат!