以编程方式清空 UIStackView
Posted
技术标签:
【中文标题】以编程方式清空 UIStackView【英文标题】:Programmatically emptying UIStackView 【发布时间】:2021-06-23 07:41:44 【问题描述】:我有一个相当简单的代码,在单击按钮时,将随机颜色的 UIView
添加到 UIStackView
,并在单击不同的按钮时,从 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
。
我在这里错过了什么?
【问题讨论】:
“因为我(稍后)想重用那些已删除的 UIViews”我不确定为什么这是不使用removeFromSuperview
... removeArrangedSubview
不删除视图的原因从视图层次结构中,所以它仍然显示。您绝对应该在这里使用removeFromSuperview
,如果您以后想使用它,请将视图保留在其他地方。
【参考方案1】:
您可以理解removeArrangedSubview
用于删除分配给子视图的约束。子视图仍在内存中,也仍在父视图中。
为了达到你的目的,你可以定义一个数组作为你的视图控制器的属性,来保存这些子视图,然后使用removeFromSuperview
。
或者在您需要将其保存在内存中而不是删除其约束的任何子视图上使用.isHidden
属性。你会看到 stackview 对它的所有子视图做了神奇的事情。
let subview = UIView()
stackView.addArrangedSubview(subview)
func didTapButton(sender: UIButton)
subview.isHidden.toggle()
最后,addArrangedSubview
将做两件事:如果视图不在 superview 的层次结构中,则将视图添加到 superview 并为其添加约束。
【讨论】:
以上是关于以编程方式清空 UIStackView的主要内容,如果未能解决你的问题,请参考以下文章
POST请求中参数以form data和request payload形式+清空数组方式