2010-07-12 17 views
5

Básicamente, quiero eliminar todos los objetos de un UIScrollView y todavía no he encontrado una solución porque un simple comando "removeAllObjects" no funciona. ¿Alguien tiene una idea de cómo hacerlo?iPhone: cómo eliminar todos los objetos de un UIScrollView

+3

No elimine todas las subvistas de una 'UISubview'. Sus vistas de indicador de desplazamiento son subvistas. También los eliminarás. Recomiendo colocar sus vistas de contenido en su propio contenedor UIView. (guárdelo como un ivar para facilitar el acceso al agregarlo y eliminarlo) – ohhorob

Respuesta

32

Aún más fácil:

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

supongo que tiene el mismo problema con 'makeObjectsPerformSelector' en lo que respecta a que recorre las subvistas mientras modifica la matriz al mismo tiempo. De esta manera es elegante y utilizada por muchos, pero ¿cómo abordar lo que progrmr mencionó anteriormente? – iwasrobbed

+0

Estoy bastante seguro de que makeObjectsPerformSelector: genera una matriz temporal antes de llamar al selector en cada objeto. Si no fuera así, como dices, causaría problemas. – Kalle

9

La forma más sencilla:

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

    [subview removeFromSuperview]; 

} 
+0

¿Es seguro modificar los contenidos de la matriz mientras se repiten los elementos? Me pregunto ... – progrmr

+0

En general, probablemente no sea la mejor práctica, por lo que es posible que desee configurar una matriz temporal marcada para su eliminación. : P – iwasrobbed

+1

Definitivamente es seguro eliminar las subvistas al enumerar la colección de subvistas de los padres – ohhorob

3

dos soluciones sería, sin necesidad de retirar las barras de desplazamiento:

agregar una etiqueta a todas sus subvistas, eliminarlos usando esas etiquetas.

Implementación:

lugar esta por encima de su clase

#define XPScrollViewSubviewStartTag    100 

Cuando se agrega los objetos

for(NSInteger = 0;i<[viewArray count];i++){ 
    UIView* view = [viewArray objectAtIndex:i]; 
    view.tag = XPScrollViewSubviewStartTag + i; 
    [scrollView addSubview:view]; 
} 

Cuando más adelante desea eliminar las vistas utilizan

for(UIView* view in [scrollView subviews]){ 
     if(view.tag >= XPScrollViewSubviewStartTag) 
      [view removeFromSuperview]; 
} 

Crear un UIView encargo clase

Cuando se desea eliminar las vistas

for(id view in [scrollView subviews]){ 
     if(![view isKindOfClass:[CustomView class]]) 
      continue; 

     //not necessary, but just to make things understandable 
     CustomView* customView = (CustomView*)view; 
     [customView removeFromSuperview]; 
} 
1

solución de Oritm es agradable, pero si usted no quiere preocuparse por el uso de etiquetas, puede eliminar manualmente las vistas que desea eliminar de la vista de desplazamiento Esto supondrá que sabes qué vista eliminar. Por ejemplo, mi ScrollView solamente tiene UILabels así que cuando corro el siguiente:

// This will remove the scrollview but the scrollbars will remain 
for (UIView *subview in [self.detailsExpander.scrollView subviews]) { 
    if ([NSStringFromClass([subview class]) isEqualToString:@"UILabel"]) 
     [subview removeFromSuperview]; 
} 

Esto sólo eliminará todas las etiquetas, pero mantener las barras de desplazamiento (que son vistas de imágenes). Nota: esto no funcionará si desea mantener vistas de imágenes específicas mientras que al mismo tiempo desea mantener las barras de desplazamiento.

Cuestiones relacionadas