ios - 删除内部排列有子视图的堆栈视图的最佳方法是什么?
问题描述
我制作了一个带有一些按钮的垂直堆栈视图,用户可以在其中在一些控件之间切换:因此,当用户切换triggerMarkersBtn时,带有 2 个控件的垂直堆栈视图被添加到sourceView。
let stackView = UIStackView()
@objc func handleMarkers(sender: UIButton) {
let triggerMarkersBtn = sender
if let sourceView = self.view {
sourceView.addSubview(stackView)
stackView.axis = .vertical
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.centerXAnchor.constraint(equalTo: triggerMarkersBtn.centerXAnchor).isActive = true
stackView.topAnchor.constraint(equalTo: filterSectionView.bottomAnchor, constant: 20).isActive = true
stackView.heightAnchor.constraint(equalToConstant: 100).isActive = true
stackView.widthAnchor.constraint(equalTo: triggerMarkersBtn.widthAnchor).isActive = true
stackView.distribution = .fillEqually
stackView.spacing = 2.0
let activateMarker = UIButton()
activateMarker.addTarget(self, action: #selector(activateMarker(sender:)), for: .touchUpInside)
stackView.addArrangedSubview(activateMarker)
let deactivateMarker = UIButton()
deactivateMarker.addTarget(self, action: #selector(deactivateMarker(sender:)), for:
.touchUpInside)
stackView.addArrangedSubview(deactivateMarker)
}
}
我的问题是,当用户选择其中的按钮时,我想从其超级视图中删除堆栈视图。所以在按钮目标中类似于:removeFromSuperView()和remvoeArrangedSubviews(view:)。我还尝试更改堆栈视图的可见性。不幸的是,所有排列的子视图都一次又一次地添加到堆栈视图中。
解决方案
每次触发该方法时,不要创建按钮并将其放置stackView
在您的内部。将其设置为惰性 var:sourceView
handleMarkers
private lazy var markersStackView: UIStackView = {
let stackView = UIStackView()
stackView.axis = .vertical
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.distribution = .fillEqually
stackView.spacing = 2.0
let activateMarker = UIButton()
activateMarker.addTarget(self, action: #selector(activateMarker(sender:)), for: .touchUpInside)
stackView.addArrangedSubview(activateMarker)
let deactivateMarker = UIButton()
deactivateMarker.addTarget(self, action: #selector(deactivateMarker(sender:)), for:
.touchUpInside)
stackView.addArrangedSubview(deactivateMarker)
return stackView
}()
将它放在源视图中并隐藏它(viewDidLoad
例如,在 上):
override func viewDidLoad() {
super.viewDidLoad()
setupMarkersStackView()
}
private func setupMarkersStackView() {
sourceView.addSubview(stacmarkersStackViewView)
markersStackView.centerXAnchor.constraint(equalTo: triggerMarkersBtn.centerXAnchor).isActive = true
markersStackView.topAnchor.constraint(equalTo: filterSectionView.bottomAnchor, constant: 20).isActive = true
markersStackView.heightAnchor.constraint(equalToConstant: 100).isActive = true
markersStackView.widthAnchor.constraint(equalTo: triggerMarkersBtn.widthAnchor).isActive = true
markersStackView.isHidden = true
}
然后什么时候handleMarkers
叫你显示它:
@objc func handleMarkers(sender: UIButton) {
markersStackView.isHidden = false
}
当点击内部按钮时,您将其隐藏:
@objc func activateMarker(sender: UIButton) {
// do needed things
markersStackView.isHidden = true
}
@objc func deactivateMarker(sender: UIButton) {
// do needed things
markersStackView.isHidden = true
}
推荐阅读
- selenium - 如何使用以下 html 代码为列表框编写 xpath(供 selenium 使用 - 与 salesforce)
- node.js - 如何使用 pg-query-stream 和 async/await 流式传输记录?
- python - 使用列表元素初始化空列表字典Python
- python - 尝试将多个项目附加到列表但得到 Python TypeError:列表索引必须是整数或切片,而不是 str
- c++ - XLib - 如何正确取消增量数据传输的过程?
- r - 将r中具有分组的复杂表转换为数据框
- python-3.x - 没有名为 mysite.wsgi 的模块 django Heroku 部署
- plot - 将情节与不同的传说相结合
- c++ - 是否可以在这里减少模板参数?
- reactjs - 如果未通过身份验证,则将重定向重定向到登录-Spring 安全性