Cuando mi aplicación vuelve a su controlador de vista raíz, en el viewDidAppear:
método necesito eliminar todas las subvistas.
¿Cómo puedo hacer esto?
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 lasubviews
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:
fuente
self.view
como tú.for (UIView *v in [self.view subviews])
es más fácilEn Swift puede usar un enfoque funcional como este:
Como comparación, el enfoque imperativo se vería así:
Sin embargo, estos fragmentos de código solo funcionan en iOS / tvOS , las cosas son un poco diferentes en macOS.
fuente
(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 clicfuente
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:
SWIFT 1.2
o (menos eficiente, pero más legible)
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
debería NO ser usado.
Cita de la documentación de Apple sobre makeObjectsPerformSelector :
(que sería la dirección incorrecta para este propósito)
fuente
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
fuente
forEach
solución basada se agregó después de la suya, me perdí eso. DisculpasUse el siguiente código para eliminar todas las subvistas.
fuente
Usando la
UIView
extensión Swift :fuente
En el objetivo C, siga adelante y cree un método de categoría fuera de la clase UIView.
fuente
fuente
Para eliminar todas las subvistas Sintaxis:
Uso:
Este método está presente en el archivo NSArray.h y utiliza la interfaz NSArray (NSExtendedArray)
fuente
Si usa Swift, es tan simple como:
Es similar en filosofía al
makeObjectsPerformSelector
enfoque, sin embargo, con un poco más de seguridad de tipo.fuente
map
no debería provocar efectos secundarios. Además, se puede lograr el mismo resultado a través deforEach
.Para ios6 usando autolayout, también tuve que agregar un poco de código para eliminar las restricciones.
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.fuente
En monotouch / xamarin.ios esto funcionó para mí:
fuente
Para eliminar todas las subvistas de las supervistas:
fuente
iCount++
yiCount--
, 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 .