web-dev-qa-db-fra.com

comment faire pour 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];
}

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

32
Rahul Vyas

Pour supprimer toutes les sous-vues de toute vue, vous pouvez effectuer une itération sur les sous-vues et envoyer à chacune un appel removeFromSuperview:

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

Ceci est cependant totalement inconditionnel et éliminera les sous-vues all dans la vue donnée. Si vous voulez quelque chose de plus fin, vous pouvez choisir l’une des approches suivantes:

  • Conservez vos propres tableaux de vues de types différents pour pouvoir leur envoyer ultérieurement des messages removeFromSuperview de la même manière
  • Conservez toutes vos vues là où vous les créez et conservez des pointeurs sur ces vues afin de pouvoir les envoyer individuellement removeFromSuperview si nécessaire.
  • Ajoutez une instruction if à la boucle ci-dessus, en vérifiant l’égalité de classe. Par exemple, pour supprimer uniquement tous les boutons UIB (ou les sous-classes personnalisées de UIButton) existant dans une vue, vous pouvez utiliser quelque chose du type:
// 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
    }
}
103
Tim

Une vieille question mais comme c'est le premier coup sur Google pour cela, j'ai pensé noter aussi qu'il y a aussi cette méthode:

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

Vous ne pouvez pas faire la vérification isKindOfClass avec cela, mais c'est toujours une bonne solution à connaître.

Modifier: Un autre point à noter est que la barre de défilement d'une vue à défiler est ajoutée en tant que sous-vue à cette vue. Ainsi, si vous parcourez toutes les sous-vues d'une vue à défilement, vous le rencontrerez. Si elle est supprimée, elle s'ajoutera à nouveau - mais il est important de la savoir si vous attendez uniquement vos propres sous-classes UIView.

Amendement pour Swift 3:

myScrollView.subviews.forEach { $0.removeFromSuperview() }
37
Wex

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];
9
Terry Blanchard

Je ne pense pas que vous devriez utiliser la suggestion d'énumération rapide.

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

N'est-ce pas supposé lancer une exception si vous modifiez la collection en cours d'itération? http://developer.Apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocFastEnumeration.html#//Apple_ref/doc/uid/TP30001163-CH18-SW3

Cet exemple peut être meilleur.

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

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

}
2
Julien

Le meilleur et le plus facile est d'utiliser

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

Cela provoque en effet un crash car la règle de base est que array ne doit pas être modifié lors de l'énumération, pour éviter que nous puissions utiliser

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

Mais parfois, des plantages continuent d'apparaître car makeObjectsPerformSelector: énumère et effectue un sélecteur, également dans iOS 7

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

Remarque: énumérer les modifications préjudiciables sans itérer ...

1

Le plus simple et le meilleur moyen est

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

     [subview removeFromSuperview];

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