Отображение пользовательского текста метки ячейки в свернутом контроллере представления - PullRequest
1 голос
/ 13 марта 2020

Я минимизирую свой контроллер представления, поэтому он имеет дело только с взаимодействиями с пользователем и оставляет обработку данных и манипулирование отдельным классом модели данных.

Я не получаю никаких текстовых значений пользовательских меток ячеек при запуске приложения. Мой метод 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 ), и у меня есть все соединения построителя интерфейса раскадровки. Он работал до того, как я начал минимизировать контроллер представления, и я не изменил ни одной опции раскадровки, так как она работала.

1 Ответ

2 голосов
/ 13 марта 2020

Решение после просмотра кода:

При регистрации WordCustomCell необходимо указать имя пера (WordsTableCell) при загрузке ячейки из пера.

Кроме того, вам необходимо вызвать super.init для требуемого init? (кодировщик aDecoder: NSCoder)

Найдите ниже изменения, которые необходимо внести в ваш код.

WordsViewController.swift

// Register custom cell
tableView?.register(UINib(nibName: "WordsTableCell", bundle: nil), forCellReuseIdentifier: "WordCustomCell")
// tableView?.register(WordCustomCell.self)
tableView?.reloadData()

WordCustomCell.swift

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
} 

App showing cell text

...