为什么我不能直接设置某些 class 属性?

Why can't I set some class properties directly?

这可能是我的一些误解,但我不明白为什么这不起作用。

我创建了一个 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)
}}

如果在我的 ViewController 我写:

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

它创建了对象并完美运行,我可以访问我的对象属性,但为什么我不能像这样设置 属性:

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

它只是忽略我,但是我可以设置任何 UITableViewCell 属性:

firstCell.accessoryType = .none   // This works

嗯,它会将 mcImage 的值设置为 "plus.circle",但您看不到影响...因为您没有在为其赋值后调用 setupView()...在 setupView() 函数中,您使用此值创建带有此图像的 imageView

您可以像这样编辑您的 class

     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 = ""
    }

        }

这样每次你设置图像字符串的值...它都会刷新你的视图