以编程方式清空 UIStackView

时间:2021-06-23 07:41:44

标签: swift swift4 uistackview swift4.2

我有一个相当简单的代码,当点击一个按钮时,将一个随机颜色的 UIView 添加到一个 UIStackView 中,并在一个不同的按钮点击时,从一个随机的 UIView UIStackView

代码如下:

import UIKit

class ViewController: UIViewController, Storyboarded {
    weak var coordinator: MainCoordinator?
    @IBOutlet weak var stackView: UIStackView!
    
    var tags: [Int] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func buttonPressed(_ sender: UIButton) {
        switch sender.tag {
            case 10:
                let view = UIView(frame: CGRect(x: 0, y: 0, width: stackView.frame.width, height: 20))
                var number = Int.random(in: 0...10000)
                
                while tags.contains(number) {
                    number = Int.random(in: 0...10000)
                }
                
                tags.append(number)
                view.tag = number
                view.backgroundColor = .random()
                stackView.addArrangedSubview(view)
            case 20:
                if tags.count == 0 {
                    print("Empty")
                    return
                }
                
                let index = Int.random(in: 0...tags.count - 1)
                let tag = tags[index]
                
                tags.remove(at: index)
                
                if let view = stackView.arrangedSubviews.first(where: { $0.tag == tag }) {
                    stackView.removeArrangedSubview(view)
                }
            default:
                break
        }
    }
}

extension CGFloat {
    static func random() -> CGFloat {
        return CGFloat(arc4random()) / CGFloat(UInt32.max)
    }
}

extension UIColor {
    static func random() -> UIColor {
        return UIColor(
           red:   .random(),
           green: .random(),
           blue:  .random(),
           alpha: 1.0
        )
    }
}

我不是故意使用 removeFromSuperview - 因为我(稍后)想要重用那些已删除的 UIViews,这就是我使用 removeArrangedSubview 的原因。

我面临的问题是:

所有 UIViews 都按预期删除(当然,我知道它们还在内存中)直到我到达最后一个 - 即使被删除,它仍然出现并填充整个 {{ 1}}。

我在这里遗漏了什么?

1 个答案:

答案 0 :(得分:1)

您可以理解 removeArrangedSubview 用于删除分配给子视图的约束。子视图仍然在内存中,也在父视图中。

为了实现您的目的,您可以定义一个数组作为视图控制器的属性,以保存这些子视图,然后使用 removeFromSuperview

或者在您需要将其保留在内存中而不是删除其约束的任何子视图上使用 .isHidden 属性。你会看到 stackview 对它的所有子视图做了神奇的事情。

let subview = UIView()
stackView.addArrangedSubview(subview)

func didTapButton(sender: UIButton) {
   subview.isHidden.toggle()
}

最后,addArrangedSubview 将做两件事:如果视图不在超级视图的层次结构中,则将视图添加到超级视图并为其添加约束。

相关问题