2016-05-30 18 views
21

Dal UIStackView Class ReferenceUIStackView: è veramente necessario chiamare sia removeFromSuperView che removeArrangedSubview per rimuovere una sottoview?

In removeArrangedSubview:

Per impedire la vista di apparire sullo schermo dopo aver chiamato removeArrangedSubview dello stack: il metodo, rimuovere esplicitamente la vista dalla matrice subviews chiamando il metodo removeFromSuperview della vista.

In arrangedSubview:

Ogni volta che il metodo removeFromSuperview di una vista organizzato è chiamato, la vista pila rimuove la vista dalla sua gamma arrangedSubview

Da questi, sembra che chiamare semplicemente removeFromSuperview è abbastanza per rimuovere una sottoview e l'ho usata in quel modo senza problemi. Ho anche confermato il comportamento registrando il conteggio dell'array arrangedSubviews quando viene chiamato removeFromSuperview.

Un sacco di tutorial e commenti qui su S/O tuttavia, dite di chiamare entrambi. C'è una ragione per questo? O le persone lo fanno solo perché la documentazione lo dice?

+1

Non è una risposta adeguata per te, ma un aneddoto: stavo chiamando 'removeArrangedSubview' senza sapere che dovevo chiamare' removeFromSuperview', e in effetti stava cancellando la vista da 'arrangedSubviews' ma la vista stava ancora apparendo in 'sottoview' causando ogni tipo di rottura confusa. L'aggiunta della chiamata 'removeFromSuperview' (una volta che ho visto questa domanda!) L'ha risolta. – aehlke

+0

Non conosco la risposta, neanche. Ma stavo avendo un problema in cui tutte le mie sottoview non venivano rimosse dopo aver usato RemoveArrangedSubview. Dopo aver visto questo post, ho aggiunto le chiamate removeFromSuperview e ora funziona come previsto. –

+1

La documentazione sembra suggerire che è sufficiente chiamare 'removeFromSuperview'. Sto solo chiamando 'removeFromSuperview' senza problemi. –

risposta

3

Hacking con Swift fornisce un buon esempio e spiegazione, utilizzando le visualizzazioni Web in questo caso.

Il motivo è che è possibile rimuovere qualcosa dall'elenco di sottomenu organizzato da una vista di stack, quindi aggiungerlo di nuovo in un secondo momento, senza doverlo ricreare ogni volta: era nascosto, non distrutto. Non vogliamo una perdita di memoria, quindi vogliamo rimuovere completamente le viste web cancellate. Se trovi che il tuo uso della memoria sta ballando, probabilmente hai dimenticato questo passaggio!

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

16

No, basta chiamare 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) 
2

Hai ragione, solo la chiamata alla removeFromSuperview è sufficiente per avere la vista completamente rimosso.

Ho il sospetto che la ragione per cui le persone inseriscono entrambe è perché attraversano la documentazione removeArrangedSubview che sembra dire che entrambi sono necessari. (E in effetti, essi sono, se si chiama removeArrangedSubview e desidera che la vista davvero andato.)

Il dottore ulteriore arrangedSubviews non è visto da molti, in modo che non si rendono conto removeArrangedSubview è, in questo caso, opzionale.