簡體   English   中英

swift 3 中的單例計算屬性

[英]Singleton computed property in swift 3

我試圖在我的代碼中實現一個單例 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它都會崩潰,說“這個類不符合鍵值編碼”,我認為這是因為計算屬性中的“所有者:自我”。

任何幫助將不勝感激。

在此處輸入圖片說明

問題很可能與您的ReceiptView.xib 你應該先回顧一下。 查找IBOutlet ,它存在於 xib 中,但不在您的 ReceiptView 類中,然后將其刪除。

編輯:

我的意思是,每當我創建該類的實例時,單例只會加載一次筆尖。

  1. 不,這不會那樣工作。 每次調用 init 時,您的計算屬性也會被調用,並且每次都會從 xib 創建一個新實例。

  2. 正如Carien van Zyl已經提到的,您在class var 中使用self ,它對應於MyView類本身(或者它是子類,如果它被稱為子類),而不是 instance 嘗試將nil作為owner傳遞。

  3. 整個技術在我看來是錯誤的。 你不應該在UIView子類中使用單例模式。 多次調用loadNibNamed並創建完全相同的實例並沒有錯。 如果你想在一個視圖層次結構中多次使用同一個實例,這是不可能的,因為每個視圖只能有一個超級視圖。 在這種情況下,您應該遵循 MVC 模式:創建多個MyView實例 -> 每當您更改視圖中的某些內容並希望這些更改反映在其他地方時更新模型 -> 使用更新的模型更新另一個視圖。

customeView是一個類型屬性。 因此,其中的 self 將引用MyView.self ,它是一個類類型。 類類型不包含實例變量,其中包括someLabel

請參閱Apple 關於類型的文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM