2014-10-08 6 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

subview свойство UIView является массивом AnyObject. Время выполнения происходит из-за того, что вы выполняете принудительное понижение от [AnyObject] до [UIButton].

С точки зрения компилятора, вниз литая законен:

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

потому AnyObject может быть любой класс, и UIButton класс.

В вашем случае, если вы делаете предположение, что все объекты, содержащиеся в subviews являются экземплярами UIButton, которые могут быть возможно (если вы явно добавить UIButton S только к виду), но если вид имеет и другие элементы пользовательского интерфейса (этикетки , другие представления и т. д.), тогда downcast будет работать во время выполнения.

Если, например, вид содержит другой вид, выше опущенного эквивалентно делать это:

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

которая не потому, что UIView не UIButton (хотя благодаря полиморфизму наоборот, будучи UIButton унаследован от UIView).

Если вы хотите, чтобы ваш код для печати метки для всех UIButton с, игнорируя все другие элементы пользовательского интерфейса, то @ ответ 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

1

Это работает для меня:

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

Спасибо, Стив, это спасло мой день. – Adaoli

+0

добро пожаловать. Вы также можете принять ответ, нажав галочку под кнопками голосования. –

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

Спасибо. Я ссылался на ваш ответ и немного изменился. Он отлично подходит для меня.:) ** для V в self.mainView.subviews, как [AnyObject] { , если v является UIButton {} еще {перерыва}} ** – Adaoli

+0

ваш приветствуется .. –

Смежные вопросы