Почему мой экземпляр класса table view cell не запускает свой инициализатор в моем Swift-коде?

#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:

Забыл установить источник данных и делегат!