我正在用代码创建我的项目,这有点令人困惑且难以阅读,因为在我的代码中只需要设置几行即可设置UIElements ...
所以我试图将此庞大的部分插入扩展中,并收到一条错误消息,指出存储的属性无法进入扩展,之后我的解决方案如下...
weak var centraliseButton: UIButton!
weak var infoButton: UIButton!
weak var seeFireButton: UIButton!
weak var locatManager: CLLocationManager!
weak var mapkitView: MKMapView!
weak var containerViewForInfoButton: UIView!
weak var containerViewForSeeFireButton: UIView!
,然后我在扩展文件中的函数中设置了Evertyhing,并在viewDidLoad()
中调用了该函数,但是我又遇到了很多运行时错误和无效信息,因为我在这些属性中访问了self并且它们是{ {1}}之前,所以我的最后解决方法是:
lazy var
并在扩展中设置函数中的所有内容,它可以正常工作,但没有错误,但对我来说似乎是一个不好的解决方案,我必须使用“虚拟”值初始化所有参数,因为惰性var需要立即初始化所以...
这是不好的做法吗? 有没有更好的方法可以做到这一点?
预先感谢您的回答!
答案 0 :(得分:0)
我认为您有充分的理由不只是将这些属性存储在类本身中。
因此解决此问题的方法是使用objc_getAssociatedObject和objc_setAssociatedObject。
例如,您可以在扩展程序中输入:
struct AssociatedKeys
{
static var infoButton: UInt8 = 0
}
private(set) var infoButton: UIButton?
{
get
{
guard let value = objc_getAssociatedObject(self, &AssociatedKeys.infoButton) as? UIButton else
{
return nil
}
return value
}
set(newValue)
{
objc_setAssociatedObject(self, &AssociatedKeys.infoButton, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}