如何在自定义视图类中动态替换自定义子视图?

时间:2018-01-10 21:23:35

标签: ios uiview

提供RoundedIcon: UIView类型的两个视图:

  • class ContactRoundedIcon: RoundedIcon
  • class PhoneRoundedIcon: RoundedIcon

ContactItemUIView

class ContactItem: UIView {
    var icon: RoundedIcon = PhoneRoundedIcon()

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

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

    func commonInit() {
        translatesAutoresizingMaskIntoConstraints = false

        addSubview(icon)
    }

    /* ... */

    NSLayoutConstraint.activate([
        icon.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 0),
        icon.topAnchor.constraint(equalTo: topAnchor, constant: 0)
    )]
}

和一个班级class ContactDropDownList: UIControl

我将ContactRoundedIcon分配给contactItem.icon属性。

class ContactDropDownList: UIControl {
    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

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

    func commonInit() {
        let contactItem = ContactItem()
        contactItem.icon = ContactRoundedIcon()
        self.addSubview(contactItem)
}

然后图标不会从PhoneRoundedIcon更改为ContactRoundedIcon。至少我在模拟器中看不到它。

ContactDropDownList视图作为故事板中的子视图添加。其余视图是以编程方式编写的。虽然靠自己,但他们还可以。 <{1}}实例中的图标分配没有任何效果。

出了什么问题?如何更改图标?

1 个答案:

答案 0 :(得分:1)

试试这个:

didSet

icon中,你需要摆脱旧图标,并在视图中添加一个新图标。否则你看到旧版本是正常的(在初始化程序中调用`commonInit&#39;当你设置一个新图标时,它全部被设置并且它不会被再次调用)。

此外,您还没有显示任何布局代码,因此请确保正确设置框架,或者在使用自动布局时设置约束。

修改

本身并不一定要删除旧视图。但你应该删除它,除非你真的有任何理由将其保留在那里。首先,您希望释放未使用的对象。通过将其保留在视图中,您可以保留它。其次,如果新icon具有一些透明部分(或小于旧部分),旧{{1}}的部分将是可见的。我想你也不想要。