gpt4 book ai didi

swift - 带有 Swift UIButton 的 EXC_BAD_INSTRUCTION

转载 作者:行者123 更新时间:2023-11-28 05:33:41 25 4
gpt4 key购买 nike

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

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

但如果同一 View 中有任何其他对象,如 Label 或 ImageView,我会收到错误“EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subdued=0x0)”。

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

最佳答案

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

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

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

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

在您的情况下,您假设 subviews 中包含的所有对象都是 UIButton 的实例,这是可能的(如果您显式添加 UIButtons 仅适用于 View ),但如果 View 具有其他 UI 元素(标签、其他 View 等),则向下转换将在运行时失败。

如果例如 View 包含另一个 View ,上面的向下转换等同于这样做:

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

失败是因为 UIView 不是 UIButton(尽管由于多态性,情况恰恰相反,UIButton 继承自 UIView).

如果您希望您的代码为所有 UIButton 打印标签,忽略所有其他 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)
}

关于swift - 带有 Swift UIButton 的 EXC_BAD_INSTRUCTION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26249643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com