2014-10-08 91 views
1

我在一個函數中使用下面的代碼來處理我的視圖中的所有UIButtons,並且當視圖中的所有對象都是UIButton時它工作正常。EXC_BAD_INSTRUCTION與Swift UIButton

for v in self.mainView.subviews as [UIButton] 
{ 
    println (v.tag) 
} 

但如果有像在同一個視圖標籤或ImageView的任何其他對象,我得到錯誤「EXC_BAD_INSTRUCTION(代碼= EXC_I386_INVOP,制服=爲0x0)」。

我該如何更改代碼,使其僅適用於(全部)UIButton。

回答

1

UIViewsubview屬性的AnyObject數組。運行時發生是因爲您正在執行從[AnyObject][UIButton]的強制向下轉換。

從編譯器的角度看,向下轉換是合法的:

let x: [UIButton] = [AnyObject]() as [UIButton] 

因爲AnyObject可以是任何類,並且UIButton是一類。

你的情況,你製作的包含在subviews所有對象都是UIButton情況下的假設,它可以是可能的(如果你明確添加UIButton唯一的看法),但如果認爲有其他用戶界面元素(標籤,其他視圖等),則downcast將在運行時失敗。

如果例如視圖包含另一視圖,上面的低垂相當於這樣做:

var view = UIView() 
var button = view as UIButton 

其失敗,因爲一個UIView不是UIButton(儘管由於多態性情況正好相反,是UIButtonUIView繼承)。

如果您希望您的代碼打印標籤的所有UIButton S,忽略所有其他UI元素,然後@ rahul_send89的答案是正確的:它遍歷的subview財產的所有元素,並打印標籤只有當前元素是UIButton

@ SteveRosenberg的回答反而打印所有元素的標籤,而不管它們的實際類型如何。

根據你想要用你的按鈕做什麼(我認爲在你的問題中發佈的代碼只是佔位符來解釋問題),還有一種替代方法:過濾subviews屬性中的所有按鈕並存儲到數組中:

var buttons = mainView.subviews.filter { $0 is UIButton } as [UIButton] 

,做任何你需要這個數組的UIButton,比如打印自己的標籤。

for button in buttons { 
    println(button.tag) 
} 
+0

嗨安東尼奧,謝謝你爲這個偉大的回覆。你是正確的,println只是一個佔位符。你的建議正是我想要的。它甚至給了我更多的空間來改善整個項目中的代碼。非常感謝。 – Adaoli 2014-10-08 10:21:41

1

這爲我工作:

for v in self.view.subviews as [AnyObject] 
     { 
      println (v.tag) 
     } 
+0

謝謝史蒂夫,它拯救了我的一天。 – Adaoli 2014-10-08 05:44:05

+0

不用客氣。您也可以通過點擊投票按鈕下的複選標記來接受答案。 – 2014-10-08 05:48:46

0
for v in self.mainView.subviews as [AnyObject] 
{ 
    if v is UIButton{ 
    println (v.tag) 
    } 
} 
+0

謝謝。我提到你的回答,並改變了一下。它適用於我。:) **在self.mainView.subviews V作爲[AnyObject] { 如果V的UIButton {} 其他{}破} ** 您 – Adaoli 2014-10-08 05:44:42

+0

歡迎.. – 2014-10-08 05:49:53