Qual é a melhor maneira de remover todas as subvisualizações de sua visão pessoal?


87

Eu estava pensando que talvez algo assim pudesse funcionar:

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

Eu quero remover todo tipo de subvisualização. Imagens de usuário, botões, campos de texto etc.


1
Isso vai funcionar. Você pode ter que fazer isso recursivamente se tiver várias camadas de subvisualizações ... ou talvez não. Não tenho certeza para o que você deseja fazer isso.
Dustin

Isso funciona? Achei que bseria imediatamente removido do subviewsarray, causando uma mutação dentro de um loop de enumeração rápido, o que é proibido.
Mazyod

2
@Mazyod check subviews propriedade: @property (nonatomic, readonly, copy) NSArray * subviews - é declarado como cópia, então quando estamos deletando subviews não modificamos aquele array (porque é uma cópia).
Máx.

1
@ Max: Isso está incorreto. O copyespecificador significa que ele faz uma cópia quando definido ; nada é especificado sobre como obter. É bem provável que uma cópia seja retornada, mas isso não faz parte da definição da propriedade.
jscs

@ W'rkncacnter concorda, você está certo ao dizer que a palavra-chave copy não tem nada a ver com get value (mas acho que está implícito).
Máx.

Respostas:


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

É idêntico à sua variante, mas um pouco mais curto.


Que tal, exceto isso - usando o mesmo método? @Mazyod
Hemang 01 de

Há alguma diferença (por desempenho) entre makeObjectsPerformSelector e loop manual para remover subvisualização?
Ganpat

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

Versão idêntica em Swift.


7

Rápido:

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

1

Você pode usar assim

//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 é a view da qual você deseja remover tudo. você está apenas removendo cada subvisualização fazendo forEach


Você pode expandir sua resposta?
DᴀʀᴛʜVᴀᴅᴇʀ

Isso não é uma mutação de coleção ao iterar por ela?
mixtly87 de

0

Para Swift 4 +. Você pode fazer uma extensão para UIView. Ligue sempre que necessário.

extension UIView {
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.