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.

dgund
fonte
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.

Max
fonte
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.

lcl
fonte
7

Rápido:

extension UIView {
    func removeAllSubviews() {
        for subview in subviews {
            subview.removeFromSuperview()
        }
    }
}
mixel
fonte
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

spikee
fonte
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() }
    }
}
Ishwardgret
fonte