32 votes

Comment supprimer les sous-vues de scrollview?

Comment puis-je supprimer toutes les vues secondaires de mon scrollview ...

J'ai un uiview et un bouton au-dessus dans le scrollview quelque chose comme ça ....

voici mon code pour ajouter une sous-vue en vue de défilement

 -(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));}
}
 

et voici le code pour supprimer les sous-vues

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

texte alternatif

104voto

Tim Points 33042

Pour supprimer tous les sous-vues à partir d'une vue, vous pouvez effectuer une itération sur les sous-vues et envoyer chacun un removeFromSuperview appel:

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

C'est totalement inconditionnelle, même si, et se débarrasser de tous les sous-vues dans la vue donnée. Si vous voulez quelque chose de plus fin, vous pouvez prendre n'importe quel de plusieurs approches différentes:

  • Maintenir vos propres tableaux de points de vue des différents types de sorte que vous pouvez les envoyer en removeFromSuperview messages plus tard, de la même manière
  • Conserver tous vos points de vue où vous les créez et maintenez le doigt sur à des pointeurs vers ces points de vue, de sorte que vous pouvez les envoyer en removeFromSuperview individuellement que nécessaire
  • Ajouter un if déclaration ci-dessus de la boucle, de la vérification de l'égalité des classes. Par exemple, pour supprimer tous les UIButtons (ou personnalisé des sous-classes de UIButton) qui existent dans une vue, vous pouvez utiliser quelque chose comme:
// 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
    }
}

38voto

Wex Points 1823

Une vieille question; mais comme c'est la première frapper sur Google pour cela, j'ai pensé que je voudrais aussi faire une remarque qu'il y a aussi cette méthode:

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

Vous ne pouvez pas faire la isKindOfClass vérifier avec cela, mais c'est toujours une bonne solution pour le savoir.

Edit: un Autre point à noter est que la barre de défilement d'une scrollview est ajouté une sous-vue pour que le scrollview. Ainsi, si vous parcourir tous les sous-vues d'une scrollview, vous allez venir à travers elle. Si on les retire, il va ajouter de nouveau - mais il est important de savoir si vous êtes seulement attendons de votre propre UIView des sous-classes pour y être.

9voto

Terry Blanchard Points 399

Pour ajouter à ce que Tim a dit, j'ai remarqué que vous marquiez vos points de vue. Si vous souhaitez supprimer une vue avec une certaine balise, vous pouvez utiliser:

 [[myScrollView viewWithTag:myButtonTag] removeFromSuperview];
 

9voto

Coderdad Points 515

Je ne pense pas que vous devriez utiliser le fast énumération suggestion.

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

N'est-ce pas censé lancer une exception si vous modifiez la collection itérée? http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocFastEnumeration.html#//apple_ref/doc/uid/TP30001163-CH18-SW3

Cet exemple peut-être mieux.

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

2voto

Julien Points 613

Le problème de UIScrollView et des autres sous-classes d’UIView est qu’elles contiennent initialement certaines vues (comme les barres de défilement verticale et horizontale pour UIScrollView). J'ai donc créé une catégorie de UIView pour supprimer les sous-vues filtrées sur la classe.

Par exemple:

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

Le code:

 - (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)];

}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X