使用Swift UIButton进行EXC_BAD_INSTRUCTION

时间:2014-10-08 05:15:47

标签: swift uibutton ios8 exc-bad-instruction

我在函数中使用下面的代码来处理我视图中的所有UIButton,当视图中的所有对象都是UIButton时,它可以正常工作。

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

但是如果同一视图中有Label或ImageView等其他对象,我会收到错误'EXC_BAD_INSTRUCTION(code = EXC_I386_INVOP,subdued = 0x0)'。

我应该如何更改代码,使其仅适用于(所有)UIButton。

3 个答案:

答案 0 :(得分:1)

这对我有用:

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

答案 1 :(得分:1)

subview的{​​{1}}属性是UIView的数组。发生运行时是因为您正在执行从AnyObject[AnyObject]的强制转发。

从编译器的角度来看,向下转换是合法的:

[UIButton]

因为let x: [UIButton] = [AnyObject]() as [UIButton] 可以是任何类,AnyObject是一个类。

在您的情况下,您假设UIButton中包含的所有对象都是subviews的实例,这是可能的(如果您只将UIButton显式添加到视图中) ,但如果视图有其他UI元素(标签,其他视图等),那么向下转换将在运行时失败。

例如,如果视图包含另一个视图,则上述向下转换相当于执行此操作:

UIButton

失败,因为var view = UIView() var button = view as UIButton 不是UIView(虽然多亏了多态,反之亦然,UIButton继承自UIButton

如果您希望代码打印所有UIView的标记,忽略所有其他UI元素,那么@ rahul_send89的答案是正确的:它遍历UIButton属性的所有元素,并且仅当当前元素是subview时才打印标记。

@ SteveRosenberg的答案是打印所有元素的标记,无论它们的实际类型如何。

根据您对按钮的处理方式(我假设您的问题中发布的代码只是占位符来解释问题),还有另一种方法:从UIButton属性中过滤所有按钮并存储到一个数组:

subviews

并使用此var buttons = mainView.subviews.filter { $0 is UIButton } as [UIButton] 数组执行任何操作,例如打印标记。

UIButton

答案 2 :(得分:0)

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