0

J'ai une vue défilement et j'ai besoin de recharger le contenu souvent pendant que mon application est en cours d'exécution. En ce moment, je suis en utilisant la ligne de code suivante pour supprimer les sous-vues avant de les ajouter à nouveau:Quel est un bon moyen de supprimer toutes les sous-vues d'un UIScrollView?

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

devrais-je utiliser les éléments suivants à la place? Pour une raison quelconque, la (première) ligne de code ci-dessus semble planter l'application toutes les 16 fois qu'elle est exécutée. Suis-je une fuite de mémoire quelque part? La méthode suivante prend un tableau de vues, le scroller (qui est une constante) et la direction.

Edit:

- (void)loadViews:(NSArray *)views IntoScroller:(UIScrollView *)scroller withDirection:(NSString *)direction{ 
//Set up the scrollView 

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

if([direction isEqualToString:@"horizontal"]){ 
    scrollView.frame = CGRectMake(0, 0, 1024, 768); 
    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * [[NSNumber numberWithUnsignedInt:[views count]] floatValue], scrollView.frame.size.height); 
}else if([direction isEqualToString:@"vertical"]){ 
    scrollView.frame = CGRectMake(0, 0, 1024, 768); 
    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width, scrollView.frame.size.height * [[NSNumber numberWithUnsignedInt:[views count]] floatValue]); 
} 

for (int i=0; i<[[NSNumber numberWithUnsignedInt:[views count]] intValue]; i++) { 

    [[[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view] setFrame:scrollView.frame]; 

    if([direction isEqualToString:@"horizontal"]){ 
     [[[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view] setFrame:CGRectMake(i * [[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view].frame.size.width, 0, scrollView.frame.size.width, scrollView.frame.size.height)];//CGRectMake(i * announcementView.view.frame.size.width, -scrollView.frame.origin.x, scrollView.frame.size.width, scrollView.frame.size.height)]; 
    }else if([direction isEqualToString:@"vertical"]){ 
     [[[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view] setFrame:CGRectMake(0, i * [[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view].frame.size.height, scrollView.frame.size.width, scrollView.frame.size.height)]; 
    } 

    [scrollView addSubview:[[views objectAtIndex:[[NSNumber numberWithInt:i] unsignedIntValue]] view]]; 
} 

}

Répondre

4

Le premier exemple que vous avez donné est la bonne façon de supprimer des sous-vues d'un UIScrollView.

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

Réglage subviews à nil efficacement nils-sur l'objet de collection la gestion des sous-vues, ce qui rend impossible d'ajouter de nouveaux sous-vues.

+0

Je reste la mémoire qui fuit ou quelque chose. Où pourrais-je me tromper? – Moshe

+0

Ok, donc à chaque fois que je veux réinitialiser les sous-vues, comment je fais? – Moshe

+0

@Moshe Appelez simplement la méthode comme vous l'avez décrit, c'est tout. Vous ne pouvez pas réinitialiser le tableau lui-même, lorsque vous appelez 'removeFromSuperview:' il devrait le faire pour vous. –

1

est en dessous du code pour supprimer toutes les vues sous de la vue de défilement:

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

     }