我正在尝试在我的代码中实现单例UIView实例,所以每当我创建一个'MyView'实例时,nib文件只会加载一次,然后再次重用:
class MyView : UIView {
@IBOutlet weak var someLabel: UILabel!
static var customeView : UIView = {
let view = Bundle.main.loadNibNamed(String(describing: MyView.self), owner: self, options: nil)?[0] as! UIView
return view
}()
convenience init() {
self.init(frame: CGRect(x: 0, y: 0, width: 576, height: 30))
let viewForOnce = MyView.customeView
viewForOnce.frame = bounds
}
}
问题是每当我调用MyView.customeView
它就会崩溃说“这个类不符合键值编码”时,我认为这是因为计算属性中的'owner:self'而发生的
任何帮助将不胜感激。
答案 0 :(得分:1)
问题很可能与您的ReceiptView.xib
有关。你应该先复习一下。
查找一个IBOutlet
,它位于xib中,但不在ReceiptView类中,并将其删除。
修改强>
我的意思是单身人士每次只加载一次笔尖 创建该类的实例。
不,这不会那样。每次调用init时,都会调用您的计算属性,并且每次都会从xib创建一个新实例。
正如 Carien van Zyl 已经提到的那样,您在self
var中使用class
对应MyView
类本身< / strong>(或者它的子类,如果它需要一个子类),不是实例。请尝试将nil
改为owner
。
整个技术对我来说都是错误的。您不应该将单例模式与UIView
子类一起使用。
多次调用loadNibNamed
并创建完全相同的实例没有错。如果要在视图层次结构中多次使用同一实例,则不可能,因为每个视图只能有一个超级视图。在这种情况下,您应该遵循MVC模式:创建多个MyView
实例 - &gt;每当您在视图中更改某些内容并希望将这些更改反映到其他位置时更新模型 - &gt;使用更新的模型更新另一个视图。
答案 1 :(得分:0)
customeView
是一个类型属性。因此,在其中的self,将引用MyView.self
这是类类型。类类型不包含实例变量,包括someLabel
。