¿Eliminar todas las subvenciones?

Cuando mi aplicación vuelve a su controller de vista raíz, en el método viewDidAppear: necesito eliminar todas las subvenciones.

¿Cómo puedo hacer esto?

    Edit: Gracias a cocoafan : esta situación está confundida por el hecho de que NSView y UIView manejan las cosas de manera diferente. Para NSView (desarrollo de Mac para escritorio únicamente), simplemente puede usar lo siguiente:

     [someNSView setSubviews:[NSArray array]]; 

    Para UIView (solo para desarrollo de iOS), puede utilizar makeObjectsPerformSelector: forma makeObjectsPerformSelector: porque la propiedad de subviews devolverá una copy de la matriz de subvistas:

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

    Gracias a Tommy por señalar que makeObjectsPerformSelector: parece modificar la matriz de subviews mientras se lo enumera (lo que hace para NSView , pero no para UIView ).

    Consulte esta pregunta SO para más detalles.

    Nota: el uso de cualquiera de estos dos methods eliminará todas las vistas que contiene su vista principal y las liberará , si no se retienen en otro lugar. De la documentation de Apple en removeFromSuperview :

    Si la vista de supervisión del receptor no es nula, este método libera el receptor. Si planea reutilizar la vista, asegúrese de retenerla antes de llamar a este método y asegúrese de liberarlo cuando sea apropiado cuando termine con él o después de agregarlo a otra jerarquía de vista.

    Obtén todas las subvenciones de tu controller raíz y envía cada una una removeFromSuperview:

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

    En Swift puede usar un enfoque funcional como este:

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

    Nota: este código se actualiza a la syntax de Swift 2.1+.

    A modo de comparación, el enfoque imperativo se vería así:

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

    Estos fragments de código solo funcionan en iOS / tvOS , las cosas son un poco diferentes en OS X.

    Si desea eliminar todas las subvenciones en su UIView (aquí yourView ), escriba este código en el button haga clic:

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

    Al eliminar todas las subvistas, es una buena idea comenzar a borrar al final de la matriz y seguir eliminando hasta llegar al comienzo. Esto se puede lograr con estas dos líneas de código:

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

    SWIFT 1.2

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

    o (less eficiente, pero más legible)

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

    NOTA

    No debe eliminar las subvenciones en order normal, ya que puede provocar un locking si se elimina una instancia de UIView antes de que el post removeFromSuperview se haya enviado a todos los objects de la matriz. (Obviamente, eliminar el último elemento no causaría un locking)

    Por lo tanto, el código

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

    NO debe usarse.

    Cita de la documentation de Apple sobre makeObjectsPerformSelector :

    Envía a cada object en la matriz el post identificado por un selector dado, comenzando con el primer object y continuando a través de la matriz hasta el último object.

    (que sería la dirección equivocada para este propósito)

    Pruebe de esta manera swift 2.0

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

    Si está usando Swift, es tan simple como:

     subviews.map { $0.removeFromSuperview } 

    Es similar en filosofía al enfoque makeObjectsPerformSelector , sin embargo, con un poco más de security de tipo.

    Uso de la extensión Swift UIView :

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

    En el objective-C, avance y cree un método de categoría fuera de la class UIView.

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

    Use el código siguiente para eliminar todas las subvenciones.

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

    Para eliminar todas las subvenciones Sintaxis:

     - (void)makeObjectsPerformSelector:(SEL)aSelector; 

    Uso:

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

    Este método está presente en el file NSArray.h y usa la interfaz NSArray (NSExtendedArray)

    Para ios6 con autolayout, tuve que agregar un poco de código para eliminar las restricciones también.

     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)]; 

    Estoy seguro de que hay una manera más clara de hacer esto, pero funcionó para mí. En mi caso, no pude usar una [tagview removeConstraints:tagview.constraints] ya que había restricciones establecidas en XCode que se estaban borrando.

    En monotouch / xamarin.ios esto funcionó para mí:

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

    Para eliminar todas las subvenciones de las superventas:

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