2017-02-19 95 views
2

我試圖將一個IBInspectable顏色添加到UIView中,以便我可以在故事板中設置它並稍後在代碼中使用它。在this post regarding UITextField我見過我可以利用擴展並添加一個計算屬性,但我不能讓它適用於UIView。無法在UIView中設置@IBInspectable計算屬性

Identity inspector enter image description here

我得到一個崩潰:無法設置(additionalColor1)用戶定義的檢查上(UIView的)屬性:[setValue方法:forUndefinedKey:]:這個類不是密鑰值編碼兼容的關鍵additionalColor1。

任何想法是什麼導致崩潰和如何解決它?

這裏是我的代碼:

extension UIView { 
    @IBInspectable var additionalColor1: UIColor? { 
     return self.additionalColor1 
    } 
} 

對於參考,我粘貼,可以用來爲UITextField的佔位符的顏色(同上URL)的代碼。該工程確定:

extension UITextField { 
    @IBInspectable var placeHolderColor: UIColor? { 
     get { 
      return self.placeHolderColor 
     } 
     set { 
      self.attributedPlaceholder = NSAttributedString(string: self.placeholder != nil ? self.placeholder! : "", attributes:[NSForegroundColorAttributeName: newValue!]) 
     } 
    } 
} 
+0

* self.additionalColor1 *如何設置?如果它在代碼中,設計時工具如何執行它? – dfd

+0

應在故事板中設置Afaik'self.additionalColor1'。我粘貼的圖片顯示我已將其設置爲身份檢查員。在我粘貼的剪輯中,我沒有推動二傳手。但是,將'self.additionalColor1 = newValue'添加到setter仍然會導致崩潰。 – Andrej

+1

我很困惑。我原來的評論(很快被刪除)也詢問您是否可以將IBInspectable放入擴展中。然後我注意到你聲稱你可以(placeHolderColor)。因此,假設它可以,爲什麼你不同的編碼additionalColor1?你有一個明確的getter/setter在一個,但不是另一個。並且(我認爲)如果您爲additionalColor1刪除了IBInspectable概念,那麼您已經編寫了一個只讀屬性。 – dfd

回答

3

正如在你的問題中提到的標題

斯威夫特擴展只能添加計算性質的類型,但它們不能添加存儲性能

(有關詳細信息,請參閱ExtensionThe Swift Programming Language。)

您發佈的例子實際上是有缺陷的 - 即使它在這個時候#2 50個upvotes。如果您從屬性的getter中返回屬性本身的值,那麼您正在創建一個循環。

@IBInspectable var additionalColor1: UIColor? { 
    return self.additionalColor1 
} 

如果你有一個view,並嘗試在任何地方訪問view.additionalColor1在你的代碼的屬性的getter將被調用返回self.additionalColor1 - 或者換句話說:它再次返回該屬性的值 - 你猜怎麼樣?通過調用propery的getter! (依此類推......)

你提到的只是「作品」的帖子中的例子,因爲吸氣者顯然從未被調用過。這只是設置計算屬性placeHolderColor改變另一個存儲的屬性,即文本字段的attributedPlaceholder

因此,儘管你可以通過添加擴展計算屬性以現有的類可以從未把它看作是某處存儲在一個具體的數值。計算屬性只能用於以某種方式轉換您分配給它的值,並將結果存儲在現有存儲的屬性中。

+1

我們應該downvote或編輯鏈接的有缺陷的遞歸答案。 –

1

您的additionalColor將如何使用?

我最近不得不做類似的事情,但在我的情況下,我總是立即應用額外的價值。

例如,我想創建一個看起來像平行四邊形的按鈕。所以,我想要一種方法在Storyboard中添加一個值,該值將應用CGAffineTransform。我沒有真正存儲偏斜值,只是用來改變事物的外觀。然後,在get中,我將視圖的affineTransform例程中的值傳回。

@IBInspectable var skewOffset: Float { 
    set(newSkewOffset) { 
     let affineTransform : CGAffineTransform = CGAffineTransform(a: 1.0, b: 0.0, c: CGFloat(newSkewOffset), d: 1.0, tx: 0.0, ty: 0.0) 
     layer.setAffineTransform(affineTransform) 
    } 
    get { 
     return Float(layer.affineTransform().c) 
    } 
} 

所以,我不存儲skewOffset,我申請了,我知道我能看它以後,如果我需要得到它。