2010-11-09 12 views
11

Saludos a todos,xcode Quitar algunas subvistas de la vista

Soy novato y he estado tratando de solucionar esto durante unos días.

Estoy agregando imágenes a una vista a través de UItouch. La vista contiene un fondo sobre el cual se agregan las nuevas imágenes. ¿Cómo elimino las imágenes que agrego de la subvista, sin deshacerme del UIImage que es el fondo? Cualquier ayuda es muy apreciada. Gracias por adelantado.

Aquí está el código:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *) event { 
NSUInteger numTaps = [[touches anyObject] tapCount]; 

if (numTaps==2) { 
    imageCounter.text [email protected]"two taps registered";  

//__ remove images 
    UIView* subview; 
    while ((subview = [[self.view subviews] lastObject]) != nil) 
     [subview removeFromSuperview]; 

    return; 

}else { 

    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:self.view]; 
    CGRect myImageRect = CGRectMake((touchPoint.x -40), (touchPoint.y -45), 80.0f, 90.0f); 
    UIImageView *myImage = [[UIImageView alloc] initWithFrame:myImageRect]; 

    [myImage setImage:[UIImage imageNamed:@"pg6_dog_button.png"]]; 
    myImage.opaque = YES; // explicitly opaque for performance 


    [self.view addSubview:myImage]; 
    [myImage release]; 

    [imagesArray addObject:myImage]; 

    NSNumber *arrayCount =[self.view.subviews count]; 
    viewArrayCount.text =[NSString stringWithFormat:@"%d",arrayCount]; 
    imageCount=imageCount++; 
    imageCounter.text =[NSString stringWithFormat:@"%d",imageCount]; 

} 

}

Respuesta

28

Lo que necesita es una forma de distinguir los agregados UIImageView objetos del fondo UIImageView. Hay dos maneras en que puedo pensar para hacer esto.

Enfoque 1: Asignar añadió UIImageView objetos un valor de etiqueta especial

Cada objeto UIView tiene una propiedad tag que es simplemente un valor entero que puede ser utilizado para identificar ese punto de vista. Se podría establecer el valor de la etiqueta de cada punto de vista agregado a 7 así:

myImage.tag = 7; 

Entonces, para eliminar los puntos de vista agregado, se puede pasar a través de todos los subvistas y sólo quitar los que tienen un valor de la variable de 7:

for (UIView *subview in [self.view subviews]) { 
    if (subview.tag == 7) { 
     [subview removeFromSuperview]; 
    } 
} 

enfoque 2: Recuerde que el fondo de la vista

Otro enfoque es mantener una referencia a la opinión del fondo para que pueda distinguirlo de las opiniones añadido. Haga un IBOutlet para el fondo UIImageView y asígnelo de la manera habitual en Interface Builder. Luego, antes de eliminar una subvista, simplemente asegúrate de que no sea la vista de fondo.

for (UIView *subview in [self.view subviews]) { 
    if (subview != self.backgroundImageView) { 
     [subview removeFromSuperview]; 
    } 
} 
+2

respuesta 1 es generalmente correcta, pero tenga en cuenta que usted podría restringir la búsqueda usando [UIView viewWithTag: 7] y no tiene que iterar a través de cada vista individual. Por supuesto, esto puede no salvarle nada, pero es bueno saber – justin

+0

Chicos muchas gracias por su aporte. Voy a probar esto hoy. Hice un largo trabajo para agregar el fondo una vez que se borró todo. No exactamente elegante pero funcionó .. –

+1

Su solución es muy inteligente, aunque podría no funcionar tan bien cuando necesite más control sobre sus vistas. Si intenta usar 'viewWithTag:', como lo sugiere @justin, tenga en cuenta que solo devolverá la primera vista encontrada con una etiqueta que coincida. Es un método muy conveniente cuando solo hay una vista de este tipo. Si tiene muchas vistas con etiquetas coincidentes, terminará iterando para encontrarlas todas. Sugerencia adicional: las vistas tienen un valor de etiqueta predeterminado de cero, por lo tanto, evite usar cero como valor de etiqueta de identificación. –

0

Un código con mayor rapidez para la aproximación # 1 en sólo una línea funcional de código:

self.view.subviews.filter({$0.tag == 7}).forEach({$0.removeFromSuperview()}) 
Cuestiones relacionadas