在子 class 中更改子视图 class

Change subview class in subclass

假设我有一个名为自定义视图的 UITableViewCell class,带有一个 class GenericButton 按钮,该按钮已在自动布局中以编程方式定义

class View: UITableViewCell {
    var button: GenericButton

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        button = GenericButton()
        // blah blah blah constraints
    }
}

现在假设我有一个名为 OtherView 的视图的子class,我希望该按钮成为名为 CircleButton 的 GenericButton 的子class。

class OtherView: View {
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        button = CircleButton()
    }
}

但是,我的视图仍然显示一个 GenericButton,而不是 CircleButton。我做错了什么?

好的,我已经考虑了几个小时,得出的结论是这可能是最佳答案。

import UIKit

class View: UITableViewCell
{
    var button: GenericButton! = nil

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

    override init(style: UITableViewCellStyle, reuseIdentifier: String?)
    {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

    convenience init(button: Bool, style: UITableViewCellStyle, reuseIdentifier: String?)
    {
        self.init(style: style, reuseIdentifier: reuseIdentifier)

        if button
        {
            button = GenericButton()
            setConstraint()
        }
    }

    private func setConstraint()
    {
        // blah blah blah constraints
    }
}

class OtherView: View
{
    required init(coder aDecoder: NSCoder)
    {
        super.init(coder: aDecoder)
    }

    override init(style: UITableViewCellStyle, reuseIdentifier: String?)
    {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

    convenience init(button: Bool, style: UITableViewCellStyle, reuseIdentifier: String?)
    {
        self.init(style: buttonWithStyle, reuseIdentifier: reuseIdentifier)

        if button
        {
            button = CircleButton()
            setConstraint()
        }
    }
}

我猜你在 View 中将按钮添加到视图层次结构中。如果是这样,button = CircleButton() 就没有意义了。但是,您仍然可以通过删除 OtherView 中的按钮,然后重新添加它来实现。

class View: UITableViewCell {
    var button: GenericButton

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        button = GenericButton()
        addButton(button)
    }

    func addButton(button: UIButton) {
        // add button into view hierarchy here
    }
}

class OtherView: View {
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        button.removeFromSuperview()
        button = CircleButton()
        addButton(button)
    }
}