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.