Qual è il modo migliore per rimuovere tutte le sottoview da te self.view?


87

Stavo pensando che forse qualcosa del genere potrebbe funzionare:

    for (UIView* b in self.view.subviews)
    {
       [b removeFromSuperview];
    }

Voglio rimuovere ogni tipo di sottoview. Immagini, pulsanti, campi di testo ecc.


1
Funzionerà. Potrebbe essere necessario farlo in modo ricorsivo se si dispone di diversi livelli di visualizzazioni secondarie ... o forse no. Non sono sicuro di cosa vuoi fare.
Dustin

Che funzioni? Ho pensato che bsarebbe stato prontamente rimosso subviewsdall'array, causando una mutazione all'interno di un ciclo di enumerazione veloce, che è vietato.
Mazyod

2
@Mazyod controlla la proprietà delle subviews: @property (nonatomic, readonly, copy) NSArray * subviews - è dichiarata come copia, quindi quando cancelliamo le subviews non modifichiamo quell'array (perché è una copia).
Max

1
@ Max: non è corretto. Lo copyspecificatore significa che fa una copia quando impostato ; nulla è specificato su come ottenere. È molto probabile che venga restituita una copia, ma non fa parte della definizione della proprietà.
jscs

@ W'rkncacnter d'accordo, hai ragione che la parola chiave copy non ha nulla a che fare con get value (ma penso che sia implicito).
Max

Risposte:


250
[self.view.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)];

È identico alla tua variante, ma leggermente più corto.


Che ne dici di questo, usando lo stesso metodo? @Mazyod
Hemang

C'è qualche differenza (in base alle prestazioni) tra makeObjectsPerformSelector e il ciclo manuale per la rimozione della sottoview?
Ganpat

22
self.view.subviews.forEach({ $0.removeFromSuperview() })

Versione identica in Swift.


7

Swift:

extension UIView {
    func removeAllSubviews() {
        for subview in subviews {
            subview.removeFromSuperview()
        }
    }
}

2

Puoi usare in questo modo

//adding an object to the view
view.addSubView(UIButton())

// you can remove any UIControls you have added with this code
view.subviews.forEach { (item) in
     item.removeFromSuperview()
}

view è la vista dalla quale vuoi rimuovere tutto. stai solo rimuovendo ogni sottoview eseguendo forEach


Puoi espandere la tua risposta?
DᴀʀᴛʜVᴀᴅᴇʀ

Non si tratta di mutare una raccolta mentre la si ripete?
mixtly87

0

Per Swift 4+. Puoi creare un'estensione a UIView. Chiamalo ogni volta che è necessario.

extension UIView {
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.