在Swift 3(XCode 8.3.3)中,我在UIStackView中有一个控件。我有一个UIImageViews数组,并循环遍历数组以在运行时填充堆栈视图:
for voiceIcon in voiceIcons {
let voiceView = UIImageView(image: voiceIcon)
addArrangedSubview(voiceView)
}
这些图标有时会被禁用(替换为新图像),所以为了更新控件,我有一个删除所有图标的功能,以便我可以重新添加适当的图标(如果有更好的方法) ,我在听!):
private func resetIconsView() {
for subUIView in self.subviews as [UIView] {
removeArrangedSubview(subUIView)
subUIView.removeFromSuperview()
print("Removing")
}
}
我也试过
for subUIView in self.subviews as! [UIImageView] { ... }
我为每个图标获取调试行“删除”,但它们仍然保留在控件和UI中。我是Swift的新手,所以我可能不理解某些东西,我应该采取什么方法?
答案 0 :(得分:1)
我假设你的UIStackView只包含一些UIImageView。您可以遍历堆栈视图的所有排列的子视图,并更新该imageView的图像。示例实现可能如下所示:
func changeImage() {
for view in self.arrangedSubviews {
if let imgView = view as? UIImageView {
imgView.image = UIImage(named: "taka_icon.png")
}
}
}
答案 1 :(得分:0)
尝试以下代码:
for view in arrangedSubviews {
view.removeFromSuperview()
}
答案 2 :(得分:0)
我做了扩展。您还必须删除约束(如果存在)。否则可能会造成一些麻烦。
用法:myStackView.removeAllArrangedSubviews()
public extension UIStackView {
func removeAllArrangedSubviews() {
let removedSubviews = arrangedSubviews.reduce([]) { (allSubviews, subview) -> [UIView] in
self.removeArrangedSubview(subview)
return allSubviews + [subview]
}
// Deactivate all constraints
NSLayoutConstraint.deactivate(removedSubviews.flatMap({ $0.constraints }))
// Remove the views from self
removedSubviews.forEach({ $0.removeFromSuperview() })
}
}