-1

我试图在我的代码中实现一个单例 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说“此类不符合键值编码”时它都会崩溃,我认为这是因为计算属性中的“所有者:自我”而发生的。

任何帮助将不胜感激。

在此处输入图像描述

4

2 回答 2

1

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

编辑:

我的意思是,每当我创建该类的实例时,单例只会加载一次 nib。

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

  2. 正如Carien van Zyl已经提到的那样,您使用的是对应于类本身selfclassvar (或者如果它被称为子类,则它是子类),而不是 instance。尝试通过as代替。MyViewnilowner

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

于 2016-10-18T12:38:17.727 回答
0

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

请参阅Apple 关于类型的文档

于 2016-10-18T15:14:23.447 回答