UIStackView:是否真的有必要同时调用removeFromSuperView和removeArrangedSubview来删除子视图?

时间:2016-05-30 12:28:39

标签: ios uistackview

来自UIStackView Class Reference

在removeArrangedSubview中:

  

要在调用堆栈的removeArrangedSubview:方法后阻止视图出现在屏幕上,请通过调用视图的removeFromSuperview方法显式删除子视图数组中的视图。

在arrangeSubview中:

  

每当调用排列视图的removeFromSuperview方法时,堆栈视图就会从其arrangeSubview数组中删除视图

从这些看来,调用removeFromSuperview似乎足以删除子视图,并且我一直在使用它而没有问题。我还通过在调用removeFromSuperview时记录arrangeSubviews数组的计数来确认行为。

这里有很多关于S / O的教程和评论,比如打电话给两个。是否有一个原因?或者人们只是这样做,因为文档是这样说的?

8 个答案:

答案 0 :(得分:57)

不,只需致电subview.removeFromSuperView()

/* Removes a subview from the list of arranged subviews without removing it as
 a subview of the receiver.
    To remove the view as a subview, send it -removeFromSuperview as usual;
 the relevant UIStackView will remove it from its arrangedSubviews list
 automatically.
 */
open func removeArrangedSubview(_ view: UIView)

答案 1 :(得分:15)

在iOS 12.0中,您需要使用

stackView.arrangedSubviews[index].removeFromSuperview()

如果您使用removeArrangedSubview,则存在一个错误,即删除了指定索引处的视图,但是我要清除的视图出现在CGPoint(x: 0, y: 0)处。

希望这对某人有所帮助。

答案 2 :(得分:8)

Hacking使用Swift提供了一个非常好的示例和解释,在这种情况下使用Web视图。

  

原因是您可以从堆栈视图中排列的子视图列表中删除某些内容,然后在以后重新添加它,而不必每次都重新添加它 - 它被隐藏,而不是被破坏。我们不希望内存泄漏,因此我们希望完全删除已删除的Web视图。如果你发现你的内存使用不断膨胀,你可能会忘记这一步!

https://www.hackingwithswift.com/read/31/4/removing-views-from-a-uistackview-with-removearrangedsubview

答案 3 :(得分:5)

您是对的,只需拨打removeFromSuperview即可完全删除该视图。

我怀疑人们放两者的原因是因为他们遇到removeArrangedSubview文件似乎都说需要。 (事实上​​,如果你打电话给removeArrangedSubview并希望视图真的消失,它们就是。)

许多人都没有看到arrangedSubviews中的其他文档,因此他们没有意识到removeArrangedSubview在这种情况下是可选的。

答案 4 :(得分:3)

为删除我使用此扩展名。真的不知道是否有必要删除约束。但这也许会有帮助。

extension UIStackView {
    func removeAllArrangedSubviews() {
        let removedSubviews = arrangedSubviews.reduce([]) { (allSubviews, subview) -> [UIView] in
            self.removeArrangedSubview(subview)
            return allSubviews + [subview]
        }

        for v in removedSubviews {
            if v.superview != nil {
                NSLayoutConstraint.deactivate(v.constraints)
                v.removeFromSuperview()
            }
        }
    }
}

答案 5 :(得分:2)

要从stackview中删除一个安排的子视图是

// Remove it from the stack view
    stackView.removeArrangedSubview(subView)

// now remove it from the view hierarchy – this is important!
   subView.removeFromSuperview()

答案 6 :(得分:2)

否,要删除特定视图。

func removeArrangedSubview(_视图:UIView)

要删除所有子视图

stackView.arrangedSubviews.forEach {$ 0.removeFromSuperview()}

答案 7 :(得分:0)

我建议您安排排列好的子视图,然后像下面的代码一样将其删除。

 @Override
public EditField<?> newEditField(IIpsObjectPartContainer ipsObjectPart,
        Composite extensionArea,
        UIToolkit toolkit) {
    Combo combo = toolkit.createCombo(extensionArea);
    ComboViewerField<VariationOperand> comboViewerField = new ComboViewerField<VariationOperand>(combo,
            VariationOperand.class);
    comboViewerField.setLabelProvider(new DefaultLabelProvider());
    comboViewerField.setInput(VariationOperand.values());
    return comboViewerField;
}