以程序方式清空UIStackView



我有一个相当简单的代码,单击一个按钮后,会在UIStackView中添加一个随机着色的UIView,单击另一个按钮时,会从UIStackView中删除一个随机的UIView

这是代码:

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都按预期被删除(当然,从视觉上看,我知道它们仍然在内存中(,直到我到达最后一个——即使被删除了,它仍然出现并填充了整个UIStackView

我在这里错过了什么?

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

为了实现您的目的,您可以将数组定义为视图控制器的属性,以容纳这些子视图,然后使用removeFromSuperview

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

let subview = UIView()
stackView.addArrangedSubview(subview)
func didTapButton(sender: UIButton) {
subview.isHidden.toggle()
}

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

相关内容

  • 没有找到相关文章

最新更新