2016-10-18 36 views
-1

我想在我的代码,实现了单UIView的实例,因此每当我创建“MyView的”实例的笔尖文件将加载一次,然后再重复使用它计算性能:辛格尔顿迅速3

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

+1

'这个类是不是键值编码,compliant'通常是一个Interface Builder的问题,你可以在一个延迟初始化属性 – vadian

+0

使用'self'我加倍特别检查这一项,一切都连接!我仔细检查这一个特别和一切都连接!但如果我把所有者:MyView()而不是owner:self,那么它将工作! –

+0

你为什么需要这种行为?为什么不在MyView类中添加ReceiptView?顺便说一句,你在做什么与单身模式无关。 – alexburtnik

回答

1

的问题是最可能与您的ReceiptView.xib。您应该先查看它。 查找IBOutlet,它位于xib中,但不在ReceiptView类中并将其删除。

编辑:

我的singleton加载笔尖只有一次,每当我 创建和类的实例的意思。

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

  2. 由于Carien面包车ZYL已经提到的,你是在一个class VAR其对应MyView类本身使用self(或它的子类,如果要求一个子类),不是一个实例。改为将nil改为owner

  3. 整个技术在我看来是错误的。你不应该在UIView子类中使用单例模式。 多次调用loadNibNamed并创建完全相同的实例没有任何问题。如果您想在视图层次结构中多次使用同一个实例,那么这是不可能的,因为每个视图只能有一个超级视图。在这种情况下,您应该遵循MVC模式:创建多个MyView实例 - >更新模型,无论何时更改视图中的某些内容,并希望这些更改反映到别处 - >使用更新的模型更新另一个视图。

+0

我仔细检查这一个特别和一切都连接!但如果我把所有者:MyView()而不是owner:self,那么它将工作! –

0

customeView是一个类型属性。因此,自己的内部,将参考MyView.self这是一个类的类型。类类型不包含实例变量,其中包括someLabel

Apple's documentation on Types