Respuestas:
Editar: Con gracias a cocoafan : Esta situación es confusa por el hecho de que NSView
y UIView
cosas maniobran en forma diferente. Para NSView
(solo desarrollo de Mac de escritorio), simplemente puede usar lo siguiente:
[someNSView setSubviews:[NSArray array]];
Para UIView
(solo desarrollo de iOS), puede usar de forma segura makeObjectsPerformSelector:
porque la subviews
propiedad devolverá una copia de la matriz de subvistas:
[[someUIView subviews]
makeObjectsPerformSelector:@selector(removeFromSuperview)];
Gracias a Tommy por señalar que makeObjectsPerformSelector:
parece modificar la subviews
matriz mientras se enumera (lo que hace para NSView
, pero no para UIView
).
Consulte esta pregunta SO para obtener más detalles.
Nota: El uso de cualquiera de estos dos métodos eliminará todas las vistas que contenga su vista principal y las liberará , si no se conservan en otro lugar. De la documentación de Apple sobre removeFromSuperview :
Si la vista general del receptor no es nula, este método libera al receptor. Si planea reutilizar la vista, asegúrese de conservarla antes de llamar a este método y asegúrese de liberarla según corresponda cuando haya terminado con ella o después de agregarla a otra jerarquía de vistas.
UIView
devuelve una copia de la subviews
matriz mutable, por lo que este código simplemente funciona. Historia completamente diferente en el escritorio, donde el mismo código arrojará una excepción. Ver stackoverflow.com/questions/4665179/…
someUIView.Subviews.All( v => { v.RemoveFromSuperview(); return true; } );
. En mi humilde opinión más limpio para decir lo que quiere decir: someUIView.Subviews.ToList().ForEach( v => v.RemoveFromSuperview() );
.
Obtenga todas las subvistas de su controlador raíz y envíe a cada una una removeFromSuperview:
NSArray *viewsToRemove = [self.view subviews];
for (UIView *v in viewsToRemove) {
[v removeFromSuperview];
}
self.view
como tú.
for (UIView *v in [self.view subviews])
es más fácil
En Swift puede usar un enfoque funcional como este:
view.subviews.forEach { $0.removeFromSuperview() }
Como comparación, el enfoque imperativo se vería así:
for subview in view.subviews {
subview.removeFromSuperview()
}
Sin embargo, estos fragmentos de código solo funcionan en iOS / tvOS , las cosas son un poco diferentes en macOS.
(subviews as [UIView]).map { $0.removeFromSuperview() }
.map
. Este es un efecto secundario puro y se maneja mejor así:view.subviews.forEach() { $0.removeFromSuperview() }
Si desea eliminar todas las subvistas en su UIView (aquí yourView
), entonces escriba este código en el botón de clic
[[yourView subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
Esto solo se aplica a OSX ya que en iOS se guarda una copia de la matriz
Al eliminar todas las subvistas, es una buena idea comenzar a eliminar al final de la matriz y seguir eliminando hasta llegar al principio. 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 (menos eficiente, pero más legible)
for subview in mySuperView.subviews.reverse() {
subview.removeFromSuperview()
}
NOTA
NO deberías eliminar las subvistas en orden normal, ya que puede causar un bloqueo si se elimina una instancia de UIView antes de que el removeFromSuperview
mensaje se haya enviado a todos los objetos de la matriz. (Obviamente, eliminar el último elemento no causaría un bloqueo)
Por lo tanto, el código
[[someUIView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
debería NO ser usado.
Cita de la documentación de Apple sobre makeObjectsPerformSelector :
Envía a cada objeto en la matriz el mensaje identificado por un selector dado, comenzando con el primer objeto y continuando a través de la matriz hasta el último objeto.
(que sería la dirección incorrecta para este propósito)
removeFromSuperview
finalice, la UIView se eliminará de la matriz, y si no hay otras instancias vivas con una relación fuerte con la UIView, la UIView también se eliminará. Esto puede causar una excepción fuera de límite.
[yourView subviews]
devuelve una COPIA de la matriz, por lo tanto, es seguro. (TEN EN CUENTA que en OSX, lo que dices es correcto.)
Prueba de esta manera swift 2.0
view.subviews.forEach { $0.removeFromSuperview() }
forEach
solución basada se agregó después de la suya, me perdí eso. Disculpas
Use el siguiente código para eliminar todas las subvistas.
for (UIView *view in [self.view subviews])
{
[view removeFromSuperview];
}
Para eliminar todas las subvistas Sintaxis:
- (void)makeObjectsPerformSelector:(SEL)aSelector;
Uso:
[self.View.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
Este método está presente en el archivo NSArray.h y utiliza la interfaz NSArray (NSExtendedArray)
Si usa Swift, es tan simple como:
subviews.map { $0.removeFromSuperview }
Es similar en filosofía al makeObjectsPerformSelector
enfoque, sin embargo, con un poco más de seguridad de tipo.
map
no debería provocar efectos secundarios. Además, se puede lograr el mismo resultado a través de forEach
.
Para ios6 usando autolayout, también tuve que agregar un poco de código para eliminar las restricciones.
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 forma más ordenada de hacer esto, pero funcionó para mí. En mi caso, no pude usar un directo [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 subvistas de las supervistas:
NSArray *oSubView = [self subviews];
for(int iCount = 0; iCount < [oSubView count]; iCount++)
{
id object = [oSubView objectAtIndex:iCount];
[object removeFromSuperview];
iCount--;
}
iCount++
y iCount--
, dejando el índice igual, por lo que será un bucle infinito si [oSubView count]>0
. Este es definitivamente un código defectuoso y NO UTILIZABLE .