2017-07-09 203 views
2

的出口變量尋找一種方法來迅速編程方式訪問一個出口:按名稱獲取

@IBOutlet var label1: UILabel? 
var outletName = "label1" 
view[outletName].text = "hello, world!" 

是這樣做是爲了創建自己的自定義映射,像這樣的唯一途徑?

@IBOutlet var label1: UILabel? 
let outlets = ["label1": label1] 
let outletName = "label1" 
outlets[outletName].text = "hello, world!" 

編輯:看來我的原來的問題措辭不當,讓我們再試一次:
我期待通過一些字符串標識符來訪問的變量。在我最初的問題中,我試圖問一個變量是否可以通過變量的名字以某種方式訪問​​。 IE使用變量名稱「label1」的字符串訪問變量label1。

+0

你的問題含糊不清你的真實問題是什麼。你是否需要收集'IBOutlet'?或者你實際上在使用'IBOutlet'時遇到了麻煩?我這樣說是因爲網點**是**程序化的。 –

+0

是的,我已經略微修改了這個問題,並對其進行了編輯以更好地描述我試圖實現的目標。我正在尋找一個可以用編程方式訪問變量的標識符(在本例中爲IBOutlet)。 – Rawr

回答

2

把一個字符串轉換成一個屬性訪問實際上是一種很難在純Swift中。

您可以使用一些Objective-c API來幫助您。

// Mark your outlet variable as dynamic 
@IBOutlet dynamic var label1: UILabel? 


var outletName = "label1" 
// Then you can access it via a key path (aka string) 
if let myProperty = value(forKey: string) as? UILabel { 
    myProperty.text = "Hello, world!" 
} 
+0

謝謝,這正是我想要的完成。 – Rawr

0

有一個更簡單的方法來實現你的目標。首先在你的viewDidLoad,給YOUT口獨特的標籤號碼,0以外

label1.tag = 1 

然後,每當你要訪問它

if let theLabel = self.view.viewWithTag(1) as? UILabel { 
    theLabel.text = "hello, world!" 
} 
+1

標籤是識別視圖層次結構中元素的一種非常脆弱的方式。他們應該避免。 –

+0

這是我尋找的解決方案,有沒有一種替代方案不易脆弱?尋找某種標識符來訪問IBOutlet。在我原來的問題中,我希望通過變量本身的名稱來訪問變量,但是像這樣的答案這樣的標籤將是一個可行的選擇。 – Rawr

+0

@Rawr我認爲這是符合您要求的唯一方式。是的,使用標籤並不好,但是如果你知道自己在做什麼,並且在視圖控制器中只有一個**標籤系統,我認爲使用它沒有任何壞處:) –