在removeArrangedSubview中:
要在调用堆栈的removeArrangedSubview:方法后阻止视图出现在屏幕上,请通过调用视图的removeFromSuperview方法显式删除子视图数组中的视图。
在arrangeSubview中:
每当调用排列视图的removeFromSuperview方法时,堆栈视图就会从其arrangeSubview数组中删除视图
从这些看来,调用removeFromSuperview似乎足以删除子视图,并且我一直在使用它而没有问题。我还通过在调用removeFromSuperview时记录arrangeSubviews数组的计数来确认行为。
这里有很多关于S / O的教程和评论,比如打电话给两个。是否有一个原因?或者人们只是这样做,因为文档是这样说的?
答案 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视图。如果你发现你的内存使用不断膨胀,你可能会忘记这一步!
答案 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;
}