web-dev-qa-db-fra.com

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

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?

39
robola

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)
49
zurakach

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.

12
Changnam Hong

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!

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

7
inreflection7

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.

5
Graham Perks

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()
0
Ajumal