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