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

rob*_*ola 55 ios uistackview

来自UIStackView类参考

在removeArrangedSubview中:

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

在安排的子视图中:

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

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

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

小智 62

不,只是打电话 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)
Run Code Online (Sandbox Code Playgroud)

  • 您可以引用@drekka或提供链接吗?该文档似乎很清楚不需要两个调用。 (4认同)
  • 其实这是一个不正确的解释。仅使用“removeFromSuperView()”似乎可以工作,但如果您添加和删除大量视图,可能会导致奇怪的崩溃。如果您阅读文档的讨论部分,很明显您必须同时调用两者。 (2认同)
  • @simonthumper 它解决了吗? (2认同)

Cha*_*ong 23

在iOS 12.0中,您需要使用

stackView.arrangedSubviews[index].removeFromSuperview()
Run Code Online (Sandbox Code Playgroud)

如果您使用removeArrangedSubview,则会删除指定索引处的视图,但我想要清除的视图出现的错误CGPoint(x: 0, y: 0).

希望这能有所帮助.


Aju*_*mal 10

从堆栈视图中删除排列的子视图是

// To remove it from the view hierarchy
   subView.removeFromSuperview()
Run Code Online (Sandbox Code Playgroud)


inr*_*on7 9

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

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

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

  • hackingwithswift 已更新为仅推荐“removeFromSuperview” (2认同)

Gra*_*rks 7

你是对的,只要调用removeFromSuperview就足以让视图完全删除.

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

arrangedSubviews很多人都没有看到附加的文档,所以他们没有意识到removeArrangedSubview,在这种情况下,是可选的.


Ani*_*mar 7

否,要删除特定视图。

func removeArrangedSubview(_ view: UIView)
Run Code Online (Sandbox Code Playgroud)

删除所有子视图

stackView.arrangedSubviews.forEach { $0.removeFromSuperview() }
Run Code Online (Sandbox Code Playgroud)