如何在UIStackView中刷新控件的内容?

时间:2017-07-20 14:58:47

标签: ios swift

在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的新手,所以我可能不理解某些东西,我应该采取什么方法?

3 个答案:

答案 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() })
    }
}