2015-12-08 36 views
0

我是一個絕對快捷的初學者,並試圖構建我的第一個應用程序。當我寫了一段代碼時,我不認爲它會第一次工作,並且在它發生時是可疑的。在重複循環中,我在圖表上設置了行,並想在行的左側添加一個UILabel。我想我可以let一個新的UILabel創建主視圖的子視圖,但不知道如何讓它爲每個迭代創建一個唯一的變量名稱。爲什麼這個有效?在重複循環中添加UILabel

repeat { 
     // code to make the lines here 

     // create label with minute number for each line 
     let minuteLabel = UILabel(frame: CGRectMake(0, 0, 20, 20)) 

     // code to position the label here 

     minuteLabel.text = String(numberOfLines) 

     // code to style the label 

     self.addSubview(minuteLabel) 

     numberOfLines-- 
    } 
    while numberOfLines > 0 

我認爲這將最終只是創建一個子視圖和它的文本將numberOfLines的最後一次迭代,但它完美地工作。這是否意味着我的主圖形視圖現在有(numberOfLines)個UILabel子視圖,每個子視圖具有相同的名稱?

是否有可能在這個重複循環的範圍之外單獨訪問每一個?

感謝您幫助我理解這一點!

+0

有時代碼第一次工作,也讓我感到驚訝。 – zaph

回答

0

我認爲區分對象的屬性和對象的引用很重要。當您編寫「每個具有相同名稱的UILabel子視圖的數量」並非準確的短語時,因爲這些標籤沒有名稱。一個對象(在這種情況下是一個標籤)沒有關於它可能存在多少個引用或者這些引用可能在編譯時被命名的信息。

在您的代碼示例中,您將創建一個常量引用minuteLabel並將其指定爲指向標籤。該常數只存在於該循環的一次迭代範圍內。在當前循環迭代結束時,該引用被丟棄。如果沒有對標籤對象的引用,則可能無法再找到它,但這並不意味着標籤不存在。在這種情況下,您將標籤添加爲某個其他視圖的子視圖(self)。該父視圖創建了自己對該標籤的強烈引用,並按照Automatic Reference Counting的規則,只要有強烈的引用,標籤就會繼續存在。您甚至可以使用self.subviews再次找到這些標籤,但您可能很難找出哪個標籤現在不再提供每個標籤。

注意到,雖然給出參考的名稱(如minuteLabel)對您而言很有意義,但它對運行您的應用的計算機沒有意義或甚至不爲人知。這個名字有助於我們人類跟蹤計算機內存中發生的指向UILabel的特定位置,但是您將無法使用相同的名稱從代碼中的某個其他範圍中找到相同的標籤。您的應用在不同範圍內可能有多個名爲minuteLabel的引用,並且它們甚至可以指向不同類型的對象,具有相同的名稱不會使它們成爲同一個對象。

在像那裏你有一個對象的集合,並希望能夠找到每一個以後再次一個很好的解決方案通常使用某種集合類型的情況下,一個數組允許您按照已知的順序存儲對這些標籤的引用,然後您可以在特定的索引處查找標籤,字典將允許您在某些已知的「關鍵」對象下存儲對這些標籤的引用,稍後可以使用相同的密鑰來檢索特定的標籤。

嘗試爲每個對象動態創建一個常量變量(例如創建minuteLabel0常量,然後是minuteLabel1常量...的循環)時,您不會找到很大的成功。如果不清楚爲什麼那麼值得建立一個更加精確的心智模型來說明你的程序的編譯和執行階段之間的區別。

+0

謝謝,這使得它更清晰。在這種情況下,現在我不認爲我需要再次引用它們 - 它們更容易被設置和忘記,但我相信在將來我會創建類似的東西,並且會努力想出來如何再次訪問它們! –

0

首先suviews沒有引用名稱,所以他們不會都有相同的名稱。它們包含在可以通過引用索引訪問的數組中。因此,當你將它添加添加到適當的陣列和例如每個子視圖被訪問:

self.subviews[0] 

每個元素隨後將持有相同的子視圖您正在創建的循環。希望這有助於爲您清除它。