2010-07-12 4 views
5

Fondamentalement, je veux supprimer tous les objets d'un UIScrollView et je n'ai pas encore trouvé de solution car une simple commande "removeAllObjects" ne fonctionne pas. Est-ce que quelqu'un a une idée de comment le faire?iPhone: Comment supprimer tous les objets d'un UIScrollView

+3

Ne supprimez pas toutes les sous-vues d'un 'UISubview'. Ses vues d'indicateur de défilement sont des sous-vues. Vous allez les enlever aussi. Je recommande de placer vos vues de contenu dans votre propre conteneur UIView. (Gardez-le comme un ivar pour un accès facile tout en ajoutant et en supprimant) – ohhorob

Répondre

32

Encore plus facile:

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

Je suppose que vous avez le même problème avec 'makeObjectsPerformSelector' en ce qui concerne la boucle à travers les sous-vues tout en modifiant le tableau simultanément. cette façon est élégante et utilisée par beaucoup, mais comment adressez-vous ce programme qui a été mentionné ci-dessus? – iwasrobbed

+0

Je suis à peu près sûr que makeObjectsPerformSelector: génère un tableau temporaire avant d'appeler le sélecteur sur chaque objet. Si ce n'était pas le cas, comme vous le dites, cela causerait des problèmes. – Kalle

9

La façon la plus simple:

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

    [subview removeFromSuperview]; 

} 
+0

Est-il prudent de modifier le contenu du tableau tout en faisant une boucle à travers les éléments? Je me demandais juste ... – progrmr

+0

En général ce n'est probablement pas la meilleure pratique, donc vous pouvez vouloir mettre en place un tableau temporaire marqué pour la suppression. : P – iwasrobbed

+1

Il est certainement sûr d'enlever les sous-vues en énumérant la collection de sous-vues des parents – ohhorob

3

Deux solutions seraient, sans enlever les barres de défilement:

Ajouter un tag à tous vos sous-vues, retirez-les en utilisant ces tags.

Mise en œuvre:

Placez ce au-dessus de votre classe

#define XPScrollViewSubviewStartTag    100 

Lorsque vous ajoutez les objets

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

Si vous voulez plus tard supprimer les vues utilisent

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

Créer une classe UIView personnalisée

Lorsque vous voulez supprimer les vues

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

solution de Oritm est agréable, mais si vous ne voulez pas vous embêter en utilisant les balises, vous pouvez supprimer manuellement qui vous vues souhaitez supprimer de la scrollview. Cela supposera que vous savez quelle vue à supprimer. Par exemple, mon scrollview a seulement UILabels quand j'exécutez la commande suivante:

// 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]; 
} 

Cela ne supprime toutes les étiquettes, mais garder les barres de défilement (qui sont des vues d'image). Remarque: cela ne fonctionnera pas si vous souhaitez conserver des vues d'images spécifiques tout en conservant les barres de défilement.

Questions connexes