1

我在一个函数中使用下面的代码来处理我的视图中的所有 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。

4

3 回答 3

1

subview属性UIView是一个数组AnyObject。运行时发生是因为您正在执行从[AnyObject]to的强制向下转换[UIButton]

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

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

因为AnyObject可以是任何类,并且UIButton是一个类。

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

例如,如果视图包含另一个视图,则上面的向下转换等效于执行此操作:

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

失败是因为 aUIView不是 a UIButton(尽管由于多态性,相反的情况是正确的,UIButton从 继承UIView)。

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

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

根据您想对按钮执行的操作(我认为您问题中发布的代码只是解释问题的占位符),还有另一种方法:从subviews属性中过滤所有按钮并存储到数组中:

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

并用这个数组做任何你需要的事情UIButton,比如打印他们的标签。

for button in buttons {
    println(button.tag)
}
于 2014-10-08T06:35:11.243 回答
1

这对我有用:

 for v in self.view.subviews as [AnyObject]
        {
            println (v.tag)
        }
于 2014-10-08T05:21:26.923 回答
0
for v in self.mainView.subviews as [AnyObject]
 {
   if v is UIButton{
    println (v.tag)
   }
 }
于 2014-10-08T05:22:56.737 回答