2013-03-28 61 views
0

我有一個自定義的UIButton子類。其中很多都是。for-in循環不區分類?

所以我想枚舉通過我的containerView.subviews在for-in循環中的所有人。 但是當我運行它像這樣:

for (CustomButton *button in self.containerView.subviews) 
{ 
    NSLog(@"%@", button.class); 
} 

...那被重複的第一個對象是一個UIImageView這也是一個子視圖。爲什麼不用for-in循環只給我我想要的課程?

+3

爲什麼只給你'CustomButton'子類? – Sulthan

+0

請注意,通過直接與視圖層次結合來處理UI通常是非常糟糕的設計。這是脆弱的和維修頭痛。 – bbum

+0

它正在測試代碼。這不是最終的代碼。 –

回答

5

它將遍歷數組中的所有對象並嘗試轉換爲CustomButton類。你需要做一些過濾:

for (CustomButton *button in self.containerView.subview) 
{ 
    if ([button isKindOfClass: [CustomButton class]]) 
     NSLog(@"%@", button.class); 
} 
+2

'self.containerView.subview'給出一個'UIView'數組,而不是'CustomButton'。 for循環變量應該是'id'或'UIView'。 – rmaddy

+0

@rmaddy oops。在我上面的假代碼中缺少s。 –

2

for-in循環完成它應該做的事情。它遍歷容器視圖的所有子視圖(您的單元格或滾動視圖?)。

您可以遞歸處理它們,以便以相同的方式遍歷子視圖的所有子視圖(如果有的話)。 至少這是我會做的。

然後你檢查類的類型(使用isKindOfClass)和過程只有那些你感興趣的地方。

你會驚奇地看到一個按鈕可以有多少子視圖都有。

編輯:還有一個問題,我到目前爲止還沒有解決。你要求for-in循環的「歧視」。這不是循環的一個方面。 For-in簡單地遍歷一個容器的所有元素。這可能是一個數組,字典或集合。在你的示例中,只需將每個對象類型化爲CustomButton類型對象。 這樣做即使您訪問您的自定義按鈕特有的屬性或方法,編譯器也不會出錯。然後會在運行時拋出異常。

+0

我只是誤解了它的工作原理。我認爲它只能通過已經投入的對象來列舉我想要的類。我沒有意識到這會給我所有的元素! –