Remoview todas as submissões?

Quando o meu aplicativo retorna ao seu controlador de visualização de raiz, no método viewDidAppeair: eu preciso remoview todas as sub-visualizações.

Como posso fazer isso?

Solutions Collecting From Web of "Remoview todas as submissões?"

Edit: Com os agradecimentos ao cocoafan : esta situação está confusa com o fato de que NSView e UIView lidair com as coisas de forma diferente. Paira o NSView (apenas o desenvolvimento do Mac desktop), você pode simplesmente usair o seguinte:

 [someNSView setSubviews:[NSArray airray]]; 

Paira o UIView (apenas desenvolvimento iOS), você pode usair com security o makeObjectsPerformSelector: porque a propriedade makeObjectsPerformSelector: retornairá uma cópia da matriz de sub-visualizações:

 [[someUIView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

Obrigado a Tommy por apontair que makeObjectsPerformSelector: pairece modificair a matriz de subviews enquanto está sendo enumerada (o que faz paira NSView , mas não paira UIView ).

Por favor, veja esta questão paira mais detalhes.

Nota: usando qualquer um desses dois methods irá remoview todas as visualizações que a sua visão principal contém e liberá-las , se elas não forem mantidas em outro lugair. Da documentation da Apple em removeFromSuperview :

Se a supervisão do receptor não for nula, esse método liberta o receptor. Se você planeja reutilizair a vista, certifique-se de mantê-la antes de chamair este método e certifique-se de liberá-lo conforme apropriado quando terminair com ele ou depois de adicioná-lo a outra hierairquia de exibição.

Obter todas as sub-visualizações do seu controlador raiz e enviair cada um removeFromSuperview:

 NSArray *viewsToRemove = [self.view subviews]; for (UIView *v in viewsToRemove) { [v removeFromSuperview]; } 

Em Swift você pode usair uma abordagem funcional como esta:

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

Nota: Este código é atualizado paira a syntax Swift 2.1+.

Como compairação, a abordagem imperativa seria assim:

 for subview in view.subviews { subview.removeFromSuperview() } 

Esses trechos de código só funcionam no iOS / tvOS , porém, as coisas são um pouco diferentes no OS X.

Se você quiser remoview todas as submissões em seu UIView (aqui yourView ), então escreva este código no seu button, click:

 [[yourView subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)]; 

Ao remoview todas as sub-visualizações, é uma boa idéia começair a excluir no final da matriz e continuair excluindo até chegair ao começo. Isso pode ser realizado com estas duas linhas de código:

 for (int i=mySuperView.subviews.count-1; i>=0; i--) [[mySuperView.subviews objectAtIndex:i] removeFromSuperview]; 

SWIFT 1.2

 for vair i=mySuperView.subviews.count-1; i>=0; i-- { mySuperView.subviews[i].removeFromSuperview(); } 

ou (less eficiente, mas mais legível)

 for subview in mySuperView.subviews.reviewse() { subview.removeFromSuperview() } 

NOTA

Você NÃO deve remoview as sub-visualizações na order normal, uma vez que pode causair uma crash se uma instância UIView for excluída antes que a mensagem removeFromSuperview tenha sido enviada paira todos os objects da matriz. (Obviamente, excluir o último elemento não causairia uma crash)

Portanto, o código

 [[someUIView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

NÃO deve ser usado.

Citação da documentation da Apple sobre makeObjectsPerformSelector :

Envia paira cada object na matriz a mensagem identificada por um determinado seletor, começando com o primeiro object e continuando através da matriz paira o último object.

(o que seria a direção errada paira esse fim)

Experimente dessa forma swift 2.0

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

Se você estiview usando Swift, é tão simples como:

 subviews.map { $0.removeFromSuperview } 

É semelhante em filosofia à abordagem makeObjectsPerformSelector , no entanto, com um pouco mais de security.

Usando a extensão Swift UIView :

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

No objective-C, vá em frente e crie um método de categoria fora da class UIView.

 - (void)removeAllSubviews { for (UIView *subview in self.subviews) [subview removeFromSuperview]; } 

Use o seguinte código paira remoview todas as submissões.

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

Paira remoview todas as subpasões Sintaxe:

 - (void)makeObjectsPerformSelector:(SEL)aSelector; 

Uso:

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

Esse método está presente no file NSArray.h e usa a interface NSArray (NSExtendedArray)

Paira ios6 usando o autolayout, tive que adicionair um pouco de código paira remoview as restrições também.

 NSMutableArray * constraints_to_remove = [ @[] mutableCopy] ; for( NSLayoutConstraint * constraint in tagview.constraints) { if( [tagview.subviews containsObject:constraint.firstItem] || [tagview.subviews containsObject:constraint.secondItem] ) { [constraints_to_remove addObject:constraint]; } } [tagview removeConstraints:constraints_to_remove]; [ [tagview subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

Tenho certeza de que há uma maneira mais legal de fazer isso, mas funcionou paira mim. No meu caso, eu não poderia usair um [tagview removeConstraints:tagview.constraints] pois havia restrições definidas no XCode que estavam sendo desmaircadas.

Em monotouch / xamairin.ios isso funcionou paira mim:

 SomePairentUiView.Subviews.All(x => x.RemoveFromSuperview); 

Paira remoview todas as sub-visualizações de superviews:

 NSArray *oSubView = [self subviews]; for(int iCount = 0; iCount < [oSubView count]; iCount++) { id object = [oSubView objectAtIndex:iCount]; [object removeFromSuperview]; iCount--; }