2009-08-21 10 views
32

¿Cómo se quita todos los subvistas de mi ScrollView ...cómo eliminar las subvistas de scrollview?

Tengo un UIView y un botón encima de ella en el ScrollView algo como esto ....

aquí es mi código para agregar subvista en rollo Ver

-(void)AddOneButton:(NSInteger)myButtonTag { 
lastButtonNumber = lastButtonNumber + 1; 

if ((lastButtonNumber == 1) || ((lastButtonNumber%2) == 1)) { 
btnLeft = 8;} 
else if ((lastButtonNumber == 2) || ((lastButtonNumber%2) == 0)) { 
btnLeft = 162; 
} 
CGRect frame1 = CGRectMake(btnLeft, btnTop, 150, 150); 
CGRect frame2 = CGRectMake(btnLeft, btnTop, 150, 150); 
UIButton *Button = [UIButton buttonWithType:UIButtonTypeCustom]; 
Button.frame = frame1; 
Button.tag = myButtonTag; 
[Button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside]; 
[Button setBackgroundColor:[UIColor clearColor]]; 
[Button setBackgroundImage:[UIImage imageNamed:@"WaitScreen.png"] forState:UIControlStateHighlighted]; 

    GraphThumbViewControllerobj = [[GraphThumbViewController alloc] initWithPageNumber:[[GraphIdArray objectAtIndex:myButtonTag]intValue]]; 
    GraphThumbViewControllerobj.view.frame=frame2; 
    GraphThumbViewControllerobj.lblCounter.text=[NSString stringWithFormat:@"%d of %d",myButtonTag+1,flashCardsId.count]; 
    GraphThumbViewControllerobj.lblQuestion.text=[flashCardText objectAtIndex:myButtonTag]; 
    [myScrollView addSubview:GraphThumbViewControllerobj.view]; 


[myScrollView addSubview:Button]; 


if ((lastButtonNumber == 2) || ((lastButtonNumber%2) == 0)) { 
btnTop = btnTop + 162; 
} 
if (btnTop+150 > myScrollView.frame.size.height) { 
myScrollView.contentSize = CGSizeMake((myScrollView.frame.size.width), (btnTop+160));} 
} 

y aquí está el código para eliminar subvistas

if(myScrollView!=nil) 
{ 
     while ([myScrollView.subviews count] > 0) { 
      //NSLog(@"subviews Count=%d",[[myScrollView subviews]count]); 
      [[[myScrollView subviews] objectAtIndex:0] removeFromSuperview]; 
} 

alt text http://www.freeimagehosting.net/uploads/e5339a1f51.png

Respuesta

102

Para eliminar todos los subvistas desde cualquier punto de vista, se puede iterar sobre los subvistas y enviar cada una removeFromSuperview llamada:

// With some valid UIView *view: 
for(UIView *subview in [view subviews]) { 
    [subview removeFromSuperview]; 
}

Esto es totalmente incondicional, sin embargo, y se librará de todos subvistas en la vista dada. Si quieres algo más de grano fino, se puede tomar cualquiera de varios enfoques diferentes:

  • Mantener sus propias matrices de puntos de vista de diferentes tipos para que pueda enviarlos removeFromSuperview mensajes más tarde de la misma manera
  • Retener todos sus puntos de vista donde los crea y aferre los punteros a esas vistas, para que pueda enviarlos removeFromSuperview individualmente según sea necesario
  • Agregue una declaración if al ciclo anterior, verificando la igualdad de clases. Por ejemplo, para quitar sólo todos los UIButtons (o subclases personalizados de UIButton) que existen en una vista, se podría utilizar algo como:
// Again, valid UIView *view: 
for(UIView *subview in [view subviews]) { 
    if([subview isKindOfClass:[UIButton class]]) { 
     [subview removeFromSuperview]; 
    } else { 
     // Do nothing - not a UIButton or subclass instance 
    } 
}
+0

Esto fue de gran ayuda para mí. ¡Gracias! –

+1

Buen compañero. Exactamente lo que necesitaba. – Critter

9

Para añadir a lo que dijo Tim, me di cuenta de que se está etiquetando tus vistas. Si quería eliminar una vista con una cierta etiqueta que podría utilizar:

[[myScrollView viewWithTag:myButtonTag] removeFromSuperview]; 
8

no creo que se debe utilizar la sugerencia enumeración rápida.

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

¿No se supone que una excepción si se cambia la colección siendo iterado? http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocFastEnumeration.html#//apple_ref/doc/uid/TP30001163-CH18-SW3

Este ejemplo puede ser mejor.

NSArray *subviews = [[scroller subviews] copy]; 
for (UIView *subview in subviews) { 
    [subview removeFromSuperview]; 
} 
[subviews release]; 
+0

Eso funciona perfectamente, gracias –

37

Una vieja pregunta; pero como es el primer golpe en Google para esto pensé También me gustaría hacer una nota que hay también este método:

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

No se puede hacer las isKindOfClass comprobar con esto, pero aún así es una buena solución para saber sobre.

Editar: Otro punto a tener en cuenta es que la barra de desplazamiento de una vista de desplazamiento se agrega como una subvista a esa vista de desplazamiento. Por lo tanto, si repite todas las subvistas de una vista de desplazamiento, se encontrará con ella. Si se elimina, se volverá a agregar a sí mismo, pero es importante saber esto si solo espera que sus propias subclases UIView estén ahí.

Enmienda de Swift 3:

myScrollView.subviews.forEach { $0.removeFromSuperview() } 
+0

gracias por la información. –

+0

tu propiedad ittt !!!!!!!! –

2

El problema con las subclase UIScrollView y otros de UIView es que inicialmente contiene algunos puntos de vista (como la barra de desplazamiento vertical y horizontal para el UIScrollView). Así que creé una categoría de UIView para eliminar las Subvistas filtradas en la clase.

Por ejemplo:

[UIScrollView removeAllSubviewsOfClass:[FooView class],[BarView class],nil]; 

El código:

- (void)removeAllSubviewsOfClass:(Class)firstClass, ... NS_REQUIRES_NIL_TERMINATION; 


- (void)removeAllSubviewsOfClass:(Class)firstClass, ... 
{ 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"FALSEPREDICATE"]; 

    va_list args; 
    va_start(args, firstClass); 

    for (Class class = firstClass; class != nil; class = va_arg(args, Class)) 
    { 
     predicate = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:predicate,[NSPredicate predicateWithFormat:@"self isKindOfClass:%@",class], nil]]; 
    } 

    va_end(args); 
    [[self.subviews filteredArrayUsingPredicate:predicate] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

} 
0

La forma más fácil y mejor es

for(UIView *subview in [scrollView subviews]) { 

    [subview removeFromSuperview]; 

} 
1

El mejor y más sencilla es utilizar

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

Este hecho provoca caída, ya que la regla básica es array no debe ser modificado mientras enumerado, para evitar que podemos utilizar

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

Pero a veces accidente sigue apareciendo porque makeObjectsPerformSelector: enumerará y realiza selector, también en operaciones iOS 7 ui están optimizados para realizar más rápido que en iOS 6, por lo tanto la mejor manera de recorrer matriz inversa y quite

NSArray *vs=[scrollView subviews]; 
for(int i=vs.count-1;i>=0;i--) 
{ 
    [((UIView*)[vs objectAtIndex:i]) removeFromSuperview]; 
} 

Nota: Modificación de los daños que enumeran pero no la iteración ...

0
for(subview) in self.scrollView.subviews { 
     subview.removeFromSuperview() 
} 
Cuestiones relacionadas