2016-05-23 42 views
2

我希望我所有的視圖都有一個標籤存儲的屬性,但它必須是字符串類型。所以我嘗試使用它的擴展。如何使用Swift中的變量字符串參數創建UIView的擴展?

但我得到的錯誤說擴展我不包含存儲的屬性。

問題是,如何將每個UIView中的字符串存儲在我的應用中,就像標籤一樣?

謝謝!

+0

另一個在這裏:http://stackoverflow.com/a/25428363/1187415。 –

回答

1

您不能用新存儲定義類別(Swift擴展)任何附加屬性必須計算而不是存儲。在Swift中,您需要自己定義這些以獲取計算屬性;是這樣的:

extension String { 
public var Foo : String { 
    get 
    { 
     return "Foo" 
    } 

    set 
    { 
     // What do you want to do here? 
    } 
} 
} 
+0

你如何設置它? –

+0

set {set(newValue)} –

0
class CustomView:UIView{ 
     var customTag:String? 
    } 
  1. 你必須創建一個自定義的視圖,其超類是UIView的。
  2. 在此類中添加字符串類型的屬性。
  3. 將視圖的類型更改爲您通過擴展UIView創建的 的customView。
+0

我已經使用不同類型的視圖的子類。例如,MyCustomButton,MyCustomImageView和我不想爲每個添加stringTag參數,如果我能避免它。 –

-1

如果你正在尋找的是一個視圖 「標籤」 等,但是在字符串類型,只需使用:

accessibilityIdentifier

實例編程:

myView.accessibilityIdentifier = @"YOYO"; 

故事板示例:

enter image description here

沒有擴展需要,而且,以後你將能夠從中受益,如果你將在你的應用程序作爲UIAutomation運行UIAutomation測試使用accessibilityIdentifier識別觀點:)

+0

這確實是解決問題的最簡單的解決方案,但我也想探索擴展。謝謝! –

+0

@JacobSmith,它不僅是最簡單的解決方案,而且也是Apple推薦的解決方案。但擴展是很好的知道,祝你好運! –

+0

這是濫用'accessibilityIdentifier'。擴展是要走的路。 https://developer.apple.com/reference/uikit/uiaccessibilityidentification/1623132-accessibilityidentifier?language=objc –

6

可以使用在目標c運行時中定義的setAssociatedObjectgetAssociatedObject來實現此目的。

import ObjectiveC 

var AssociatedObjectKey: UInt8 = 7 
extension UIView 
{ 
    var myOwnTag: String? 
    { 
     get 
     { 
      return getAssociatedObject(self, associativeKey: &AssociatedObjectKey) as? String ?? "" 
     } 

     set 
     { 
      var propertyVal : String? = nil 
      if let value = newValue 
      { 
       propertyVal = value 
      } 
      setAssociatedObject(self, value: propertyVal, associativeKey: &AssociatedObjectKey, policy: objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
     } 
    } 
} 

您可以參考此blog瞭解更多詳情。

+0

使用可選的綁定,'myView.myOwnTag = nil'會使屬性值保持不變,而不是將其設置爲'nil'。 –

+0

@MartinR:你是對的,我已經更新了我的答案。 –

0

您可以創建一個類這樣

class TagView: UIView { 
    var stringTag: String = "" 
} 

,讓你的看法是這個類。

相關問題