style color bar apple app ios cocoa-touch uiview subview

ios - color - ion-toolbar



¿Cuál es la forma correcta de eliminar una subvista de una jerarquía de vista y desmantelarla? (7)

¿Es posible que cell.contentView tenga la misma etiqueta que la subvista que desea eliminar? de acuerdo con la documentation viewWithTag elimina:

La vista en la jerarquía del receptor que coincide con la etiqueta. El receptor está incluido en la búsqueda.

Si este es el caso, es posible que inadvertidamente elimine cell.contentView de la celda. Si n es cero y la vista de contenido de su celda no tiene ninguna etiqueta configurada, su valor predeterminado sería 0 y eso ocurriría.

Tengo un UIView padre con varias subvistas. Periódicamente necesito eliminar una subvista y eliminarla por completo del sistema. ¿Cuál es la forma correcta de hacer esto? Intenté esto:

UIView *v = [self.containerView viewWithTag:[n integerValue]]; [v removeFromSuperview];

y obtuve un resultado extraño. Los UIView s UIView desaparecidos también desaparecieron. ¿Que esta pasando?


¿Están simplemente desapareciendo de la pantalla o desapareciendo de la pantalla y la jerarquía de vistas? ¿Qué te muestra el depurador?


Esa es la idea general correcta. esas otras UIViews que desaparecen, ¿cuál es su relación con esta UIView? ¿Son subvistas de esta vista? ¿Están desglosados ​​en el método dealloc de la vista que estás eliminando?

¿Estás seguro de que tus etiquetas son únicas?

Sujal


Para eliminar todas las subvistas de su vista:

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

Si desea eliminar alguna vista específica solo entonces:

for(UIView *subview in [view subviews]) { if([subview isKindOfClass:[UIButton class]]) { [subview removeFromSuperview]; } else { // Do nothing - not a UIButton or subclass instance } }

También puede eliminar vistas secundarias por valor de etiqueta:

for(UIView *subview in [view subviews]) { if(subview.tag==/*your subview tag value here*/) { [subview removeFromSuperview]; } else { // Do nothing - not a UIButton or subclass instance } }


Prueba esto:

UIView *v = [self.containerView viewWithTag:[n integerValue]]; v.hidden = YES; [self.containerView bringSubviewToFront:v]; [v removeFromSuperview];

Otra cosa que acabo de notar del documento de clase de UIView - ver la última oración:

removeFromSuperview Desconecta el receptor de su supervista y su ventana, y lo elimina de la cadena de respuesta.

  • (void) removeFromSuperview

Discusión Si la 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 liberarla según corresponda cuando haya terminado con ella o después de agregarla a otra jerarquía de vistas.

Nunca invoque este método mientras se visualiza.

ACTUALIZACIÓN: Ahora es 2014 y eliminar una subvista sin ocultar funciona perfectamente bien. El código del póster original debería funcionar tal como está:

UIView *v = [self.containerView viewWithTag:[n integerValue]]; [v removeFromSuperview];

Esto eliminará v y cualquier vista que haya adjuntado como subvistas, dejando atrás el contenedorView y cualquier hermano de v.


Swift 3.0:

let viewToRemove = mySuperView.viewWithTag(myTag) viewToRemove?.removeFromSuperview()


Swift 4: extiende UIView

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

o

extension UIView { public func removeAllSubviews() { self.subviews.foreach { $0.removeFromSuperview() } } }