我正在尝试使用IBInspectable
为我的观点添加边框。
extension UIView {
private func getBorder(integer: Int) -> UIRectEdge {
if integer == 1 {
return .top
} else if integer == 2 {
return .left
} else if integer == 3 {
return .right
} else if integer == 4 {
return .bottom
}
return .all
}
@IBInspectable var border: Int? {
get {
return self.border
}
set (value) {
self.border = value
for v in addBorder(edges: self.getBorder(integer: self.border!)) {
self.addSubview(v)
}
}
}
@IBInspectable var borderColor: UIColor? {
get {
return self.borderColor
}
set (value) {
self.borderColor = value //EXC_BAD_ACCESS here
for v in addBorder(edges: self.getBorder(integer: self.border!), color: borderColor!) {
self.addSubview(v)
}
}
}
private func addBorder(edges: UIRectEdge, color: UIColor = UIColor.white, thickness: CGFloat = 1) -> [UIView] {
...
}
}
崩溃发生在self.borderColor = value
行上(set
的{{1}})。
调试日志中的所有内容都是borderColor
。崩溃本身说:
线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x7fff53cc5fe8)
这是我的故事板:
如何解决此问题?谢谢!
答案 0 :(得分:1)
你有一个无限递归,导致崩溃。基本上在borderColor
的setter中你调用同一属性的setter,导致无限递归。
这是因为类扩展不允许存储属性,因此Swift不会为您的属性生成反向存储,而是将其视为计算属性,并在您尝试设置属性时调用setter。 / p>
目前我能想到两种解决方案,可以解决您的问题:
UIView
访问者(objc_setAssociatedObject()
/ objc_getAssociatedObject()
)中使用相关对象,而不是直接使用iVar参考。你不需要子类化和更新你的xib,但是这个解决方案比第一个解决方案有点麻烦。