Почему я не могу установить некоторые свойства класса напрямую? - PullRequest
1 голос
/ 26 мая 2020

Это, вероятно, какое-то заблуждение с моей стороны, но я не понимаю, почему это не работает.

Я создал подкласс UITableViewCell, например:

class MenuCell: UITableViewCell {

var mcImage: String
var mcLabel: String

init(mcImage: String, mcLabel: String) {
    self.mcImage = mcImage
    self.mcLabel = mcLabel

    super.init(style: .default, reuseIdentifier: "reuseIdentifier")

    setupView()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

func setupView() {
    let mcImageView   = UIImageView()
    let mcLabelView   = UILabel()

    mcImageView.image         = UIImage(systemName: mcImage)
    mcLabelView.text          = mcLabel

    // Rest of setup (font, colors, positions...)

    addSubview(mcImageView)
    addSubview(mcLabelView)
}}

If в моем ViewController я пишу:

var firstCell = MenuCell(mcImage: "plus.circle", mcLabel: "Some text")

Он создает объект и отлично работает, я могу получить доступ к своим свойствам объекта, но почему я не могу установить такое свойство:

firstCell.mcImage = "plus.circle"   // This doesn't work

Он просто игнорирует меня, но я могу установить любое свойство UITableViewCell:

firstCell.accessoryType = .none   // This works

1 Ответ

2 голосов
/ 26 мая 2020

Ну, он установит значение mcImage в "plus.circle", но вы не увидите воздействия ... потому что вы не вызываете setupView() после присвоения ему значения ... в функции setupView() вы используют это значение для создания imageView с этим изображением

Вы можете редактировать свой класс следующим образом

     class MenuCell: UITableViewCell {

         private let mcImageView   = UIImageView()
         private let mcLabelView   = UILabel()


            var mcImage: String {
                didSet{
                    self.mcImageView.image  = UIImage(systemName: mcImage)
                }
            }
        var mcLabel: String {
            didSet{
                self.mcLabelView.text = mcLabel
            }
        }

    init(mcImage: String, mcLabel: String) {
        self.mcImage = mcImage
        self.mcLabel = mcLabel


        super.init(style: .default, reuseIdentifier: "reuseIdentifier")
        addSubview(mcImageView)
        addSubview(mcLabelView)
        setupView()
    }
    func setupView() {


        // Rest of setup (font, colors, positions...)


    }
override func prepareForReuse() {
        super.prepareForReuse()
        mcImageView.image = nil
        mcLabelView.text = ""
    }

        }

Чтобы каждый раз, когда вы устанавливаете значение строки изображения ... оно обновлялось sh ваш взгляд

...