我希望我所有的視圖都有一個標籤存儲的屬性,但它必須是字符串類型。所以我嘗試使用它的擴展。如何使用Swift中的變量字符串參數創建UIView的擴展?
但我得到的錯誤說擴展我不包含存儲的屬性。
問題是,如何將每個UIView中的字符串存儲在我的應用中,就像標籤一樣?
謝謝!
我希望我所有的視圖都有一個標籤存儲的屬性,但它必須是字符串類型。所以我嘗試使用它的擴展。如何使用Swift中的變量字符串參數創建UIView的擴展?
但我得到的錯誤說擴展我不包含存儲的屬性。
問題是,如何將每個UIView中的字符串存儲在我的應用中,就像標籤一樣?
謝謝!
您不能用新存儲定義類別(Swift擴展)任何附加屬性必須計算而不是存儲。在Swift中,您需要自己定義這些以獲取計算屬性;是這樣的:
extension String {
public var Foo : String {
get
{
return "Foo"
}
set
{
// What do you want to do here?
}
}
}
你如何設置它? –
set {set(newValue)} –
class CustomView:UIView{
var customTag:String?
}
我已經使用不同類型的視圖的子類。例如,MyCustomButton,MyCustomImageView和我不想爲每個添加stringTag參數,如果我能避免它。 –
如果你正在尋找的是一個視圖 「標籤」 等,但是在字符串類型,只需使用:
accessibilityIdentifier
實例編程:
myView.accessibilityIdentifier = @"YOYO";
故事板示例:
沒有擴展需要,而且,以後你將能夠從中受益,如果你將在你的應用程序作爲UIAutomation運行UIAutomation測試使用accessibilityIdentifier識別觀點:)
這確實是解決問題的最簡單的解決方案,但我也想探索擴展。謝謝! –
@JacobSmith,它不僅是最簡單的解決方案,而且也是Apple推薦的解決方案。但擴展是很好的知道,祝你好運! –
這是濫用'accessibilityIdentifier'。擴展是要走的路。 https://developer.apple.com/reference/uikit/uiaccessibilityidentification/1623132-accessibilityidentifier?language=objc –
可以使用在目標c運行時中定義的setAssociatedObject
和getAssociatedObject
來實現此目的。
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瞭解更多詳情。
使用可選的綁定,'myView.myOwnTag = nil'會使屬性值保持不變,而不是將其設置爲'nil'。 –
@MartinR:你是對的,我已經更新了我的答案。 –
您可以創建一個類這樣
class TagView: UIView {
var stringTag: String = ""
}
,讓你的看法是這個類。
另一個在這裏:http://stackoverflow.com/a/25428363/1187415。 –