提供RoundedIcon: UIView
类型的两个视图:
class ContactRoundedIcon: RoundedIcon
class PhoneRoundedIcon: RoundedIcon
和ContactItem
类UIView
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}}实例中的图标分配没有任何效果。
出了什么问题?如何更改图标?
答案 0 :(得分:1)
试试这个:
didSet
在icon
中,你需要摆脱旧图标,并在视图中添加一个新图标。否则你看到旧版本是正常的(在初始化程序中调用`commonInit&#39;当你设置一个新图标时,它全部被设置并且它不会被再次调用)。
此外,您还没有显示任何布局代码,因此请确保正确设置框架,或者在使用自动布局时设置约束。
修改强>
本身并不一定要删除旧视图。但你应该删除它,除非你真的有任何理由将其保留在那里。首先,您希望释放未使用的对象。通过将其保留在视图中,您可以保留它。其次,如果新icon
具有一些透明部分(或小于旧部分),旧{{1}}的部分将是可见的。我想你也不想要。