你的逻辑是正确的,你的代码将完美运行。
但是你遇到了错误:
"Could not cast value of type '_UINavigationBarBackground'
(0x107e2f2a0) >to 'UIButton' (0x107e357e0). (lldb)
这是因为当你的for循环
运行时,第一个索引将是零,即i = 0,
buttonsToClear = view.viewWithTag(i) as! UIButton
将变成
buttonsToClear = view.viewWithTag(0) as! UIButton
在这种情况下,您正在尝试获取标记值为0的视图。
UINavigationBarBackground
的标记值也为0。
注意:
1. 当系统找到两个具有相同标记值的视图,并且您正在使用viewWithTag:
获取视图时,它将返回第一个视图。
2. 每个视图都有默认标记值0。
3. 只需在Storyboard或XIB中拖动UILabel或UIView并检查其标记值即可。
因此,在您的情况下,它将返回UINavigationBarBackground
而不是UIButton
。 因此,您无法将UINavigationBarBackground
强制转换为UIButton
。
解决方案:
永远不要从0开始给标记赋值。
尝试从某个值开始给标记赋值,例如1000。
因此,您的第一个按钮将具有标记1000,下一个将具有1001,然后是1002等等。
请按以下方式编写for循环。
var buttonsToClear : UIButton
for var i = 1000; i < 1009; i++ {
buttonsToClear = view.viewWithTag(i) as! UIButton
buttonsToClear.setImage(nil, forState: .Normal)
}
UINavigationBar
的私有属性。 - Hamishprint("i = \(i): \(view.viewWithTag(i)?.description ?? "")")
,以查看标签值和视图对象,以便确定viewWithTag
返回的是否为非按钮视图。此外,您还可以在viewDidLoad
中将标记值设置为UIButtons和您的导航栏。 - dfribif let buttonsToClear = view.viewWithTag(i) as? UIButton { .... }
,并且仅在它是一个按钮时设置图像。这是一种良好的实践,更加安全,如果您更改标签,您永远不会尝试将setImage设置为除按钮以外的其他内容。 - jrf