Estou procurando um método simples para remover de uma vez todas as subvisões de uma superview em vez de removê-las uma a uma.
//I'm trying something like this, but is not working
let theSubviews : Array = container_view.subviews
for (view : NSView) in theSubviews {
view.removeFromSuperview(container_view)
}
O que estou perdendo?
ATUALIZAR
Meu aplicativo tem um principal container_view
. Tenho que adicionar outras visualizações diferentes como subvisões container_view
para fornecer uma espécie de navegação.
Portanto, ao clicar no botão para "abrir" uma página específica, preciso remover todas as sub-visualizações e adicionar a nova.
ATUALIZAÇÃO 2 - Uma solução funcional (OS X)
Eu acho que a Apple consertou.
Agora é mais fácil do que nunca, basta ligar para:
for view in containerView.subviews{
view.removeFromSuperview()
}
Respostas:
EDIT: (obrigado Jeremiah / Rollo)
De longe, a melhor maneira de fazer isso no Swift for iOS é:
^^ Esses recursos são divertidos!
//// END EDIT
Apenas faça o seguinte:
Ou se você estiver procurando por uma classe específica
fonte
result of call to 'map' is unused
não é um erro.Array.map
na maioria dos idiomas retornará a matriz modificada. O método equivalente que não retorna uma matriz seriaview.subviews.forEach
.for view:CustomViewClass! in self.view.subviews where view.isKindOfClass(CustomViewClass) { view.doClassThing() }
Para iOS / Swift, para me livrar de todas as subvisões que eu uso:
para me livrar de todas as subvisões de uma classe específica (como UILabel), eu uso:
fonte
O código pode ser escrito mais simples da seguinte maneira.
fonte
Essa deve ser a solução mais simples.
(consulte Remover todas as subvisões? para outros métodos)
Observe que esta é uma pergunta do MacOS e esta resposta funciona apenas para o MacOS . Não funciona no iOS.
fonte
NSView
(OS X) eUIView
(iOS).NSView
não iOS eUIView
. Somente as pessoas não se importam de ler a pergunta e as tags, portanto, ela foi preenchida com respostas para iOS.Não sei se você conseguiu resolver isso, mas recentemente tive um problema semelhante em que o loop For deixava uma visualização a cada vez. Eu descobri que isso acontecia porque as self.subviews foram alteradas (talvez) quando o removeFromSuperview () foi chamado.
Para consertar isso eu fiz:
Ao fazer .copy (), eu poderia executar a remoção de cada subvisão enquanto modificava a matriz self.subviews. Isso ocorre porque a matriz copiada (subViews) contém todas as referências aos objetos e não é alterada.
EDIT: No seu caso, acho que você usaria:
fonte
let subViewsArray: Array = (parentView.subviews as NSArray).copy() as Array<NSView>
Tente o seguinte:
fonte
Extensão para remover todas as subvisões, é removida rapidamente.
fonte
Tente o seguinte:
ATUALIZAÇÃO : Se você estiver se sentindo aventureiro, poderá fazer uma extensão no UIView, como mostrado abaixo:
E chame assim:
fonte
No xcodebeta6, isso funcionou.
fonte
Eu escrevi esta extensão:
Para que você possa usar self.view.lf_removeAllSubviews em um UIViewController. Vou colocar isso na versão rápida do meu https://github.com/superarts/LFramework mais tarde, quando tiver mais experiência no swift (1 dia de exp até agora e, sim, para a API, perdi o sublinhado).
fonte
Swift 3
Se você adicionar uma tag à sua visualização, poderá remover uma visualização específica.
fonte
view.subviews.filter({$0.tag != 321}).forEach({$0.removeFromSuperview()})
?Swift 5
Eu crio 2 métodos diferentes para remover a subview. E é muito mais fácil usar se os colocarmos
extension
fonte
Sua sintaxe está um pouco desativada. Certifique-se de transmitir explicitamente.
fonte
você tem que tentar isso
fonte
Para remover apenas as subvisões de uma classe específica - esse foi o único código Swift que funcionou para mim no Xcode6.1.1. Supondo que as únicas subvisões que você deseja remover sejam do tipo UIButton ...
fonte
Uma linha:
Eu acho que essa abordagem é mais legível do que os "one-liners" usando map ou forEach . Mão curta foreach e mapa pode ser difícil de compreender, como a lógica é mais abstrato.
fonte
Para Swift 3
Fiz o seguinte, porque apenas remover da superview não apagou os botões da matriz.
fonte
Experimente isso, eu testei isso:
fonte
Para
Swift 4.+
Espero que este seja completo para você.
fonte
você tentou algo como
fonte