单例计算属性在swift 3中

时间:2016-10-18 12:24:57

标签: ios swift computed-properties

我正在尝试在我的代码中实现单例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'而发生的

任何帮助将不胜感激。

enter image description here

2 个答案:

答案 0 :(得分:1)

问题很可能与您的ReceiptView.xib有关。你应该先复习一下。 查找一个IBOutlet,它位于xib中,但不在ReceiptView类中,并将其删除。

修改

  

我的意思是单身人士每次只加载一次笔尖   创建该类的实例。

  1. 不,这不会那样。每次调用init时,都会调用您的计算属性,并且每次都会从xib创建一个新实例。

  2. 正如 Carien van Zyl 已经提到的那样,您在self var中使用class 对应MyView类本身< / strong>(或者它的子类,如果它需要一个子类),不是实例。请尝试将nil改为owner

  3. 整个技术对我来说都是错误的。您不应该将单例模式与UIView子类一起使用。 多次调用loadNibNamed并创建完全相同的实例没有错。如果要在视图层次结构中多次使用同一实例,则不可能,因为每个视图只能有一个超级视图。在这种情况下,您应该遵循MVC模式:创建多个MyView实例 - &gt;每当您在视图中更改某些内容并希望将这些更改反映到其他位置时更新模型 - &gt;使用更新的模型更新另一个视图。

答案 1 :(得分:0)

customeView是一个类型属性。因此,在其中的self,将引用MyView.self这是类类型。类类型不包含实例变量,包括someLabel

请参阅Apple's documentation on Types