Depuis la Référence de la classe UIStackView
Dans removeArrangedSubview:
Pour empêcher la vue d’apparaître à l’écran après l’appel de la méthode removeArrangedSubview: de la pile, supprimez explicitement la vue du tableau de sous-vues en appelant la méthode removeFromSuperview de la vue.
En vue arrangée:
Chaque fois que la méthode removeFromSuperview d’une vue organisée est appelée, la vue de pile supprime la vue de son tableau arrangSubview
D'après ceux-ci, il semble qu'appeler simplement removeFromSuperview est suffisant pour supprimer une sous-vue et je l'utilise comme ça sans problèmes. J'ai également confirmé le comportement en enregistrant le nombre de tableaux arraySubviews lorsque removeFromSuperview est appelé.
Beaucoup de tutoriels et commentaires ici sur S/O cependant, dites à appeler les deux. Y a-t-il une raison à cela? Ou est-ce que les gens le font simplement parce que la documentation le dit?
Non, il suffit d'appeler 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)
Dans iOS 12.0, vous devez utiliser
stackView.arrangedSubviews[index].removeFromSuperview()
Si vous utilisez removeArrangedSubview
, il existe un bogue dans lequel la vue de l'index spécifié est supprimée, mais la vue que je souhaite effacer apparaît à CGPoint(x: 0, y: 0)
.
J'espère que cela aidera quelqu'un.
Hacking With Swift fournit un très bon exemple et une bonne explication, en utilisant des vues Web dans ce cas.
La raison en est que vous pouvez supprimer quelque chose de la liste des sous-vues organisées d'une vue de pile, puis le rajouter ultérieurement, sans avoir à le recréer à chaque fois: il était masqué, pas détruit. Nous ne voulons pas de fuite de mémoire, nous voulons donc supprimer complètement les vues Web supprimées. Si vous constatez une augmentation de votre utilisation de la mémoire, vous avez probablement oublié cette étape!
Vous avez raison, l'appel à removeFromSuperview
suffit pour que la vue soit totalement supprimée.
Je suppose que la raison pour laquelle les gens associent les deux méthodes est qu’elles se trouvent dans la documentation removeArrangedSubview
qui semble indiquer que les deux sont nécessaires. (Et effectivement, ils sont, si vous appelez removeArrangedSubview
et que vous voulez que la vue disparaisse vraiment.)
Le document supplémentaire dans arrangedSubviews
n'est pas vu par beaucoup, aussi ne réalisent-ils pas que removeArrangedSubview
est, dans ce cas, facultatif.
Pour supprimer une vue organisée de la vue pile est
// Remove it from the stack view
stackView.removeArrangedSubview(subView)
// now remove it from the view hierarchy – this is important!
subView.removeFromSuperview()