首页 > 解决方案 > 删除内部排列有子视图的堆栈视图的最佳方法是什么?

问题描述

我制作了一个带有一些按钮的垂直堆栈视图,用户可以在其中在一些控件之间切换:因此,当用户切换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:)。我还尝试更改堆栈视图的可见性。不幸的是,所有排列的子视图都一次又一次地添加到堆栈视图中。

标签: iosswift

解决方案


每次触发该方法时,不要创建按钮并将其放置stackView在您的内部。将其设置为惰性 var:sourceViewhandleMarkers

    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
    }

推荐阅读