99 votes

UIStackView: Est-il vraiment nécessaire d'appeler removeFromSuperView et removeArrangedSubview pour supprimer une sous-vue?

À partir de la UIStackView de Référence de Classe

Dans removeArrangedSubview:

Pour empêcher l'affichage d'apparaître sur l'écran après l'appel de la pile removeArrangedSubview: la méthode, de supprimer explicitement le point de vue de la sous-vues tableau en appelant la vue removeFromSuperview méthode.

Dans arrangedSubview:

Chaque fois qu'une disposées vue removeFromSuperview méthode est appelée, la vue de la pile supprime l'affichage de son arrangedSubview tableau

À partir de ces éléments, il semble que l'appel juste removeFromSuperview suffit de supprimer une sous-vue et j'ai été en utilisant comme ça sans problèmes. J'ai également confirmé le comportement en vous connectant au comte de la arrangedSubviews tableau lorsque removeFromSuperview est appelé.

Beaucoup de tutoriels et de commentaires ici sur S/O cependant, disent d'appeler à la fois. Est-il une raison pour cela? Ou les gens juste le faire parce que la documentation qui l'a dit?

115voto

zurakach Points 604

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)
 

41voto

Changnam Hong Points 565

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.

15voto

inreflection7 Points 524

Piratage Avec Swift fournit un très bon exemple et l'explication, à l'aide de Web vues dans ce cas.

La raison en est que vous pouvez supprimer quelque chose à partir d'une vue de la pile est arrangé sous-vue liste, puis ajouter de nouveau plus tard, sans avoir à le recréer à chaque fois – il était caché, n'est pas détruit. Nous ne voulons pas d'une fuite de mémoire, de sorte que nous voulons supprimer supprimé les vues web entièrement. Si vous trouvez que votre utilisation de la mémoire, de la montgolfière, vous avez probablement oublié cette étape!

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

8voto

Graham Perks Points 8103

Vous avez raison, il suffit d'appeler removeFromSuperview pour que la vue soit totalement supprimée.

Je suppose que la raison pour laquelle les gens associent les deux solutions est qu’elles se trouvent dans la documentation removeArrangedSubview qui semble indiquer que les deux sont nécessaires. (Et en effet, ils le sont, si vous appelez removeArrangedSubview et souhaitez que la vue disparaisse vraiment.)

Le document supplémentaire en arrangedSubviews n'est pas vu par beaucoup, de sorte qu'ils ne réalisent pas que removeArrangedSubview est, dans ce cas, optionnel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X