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
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:
removeFromSuperview
de la même manièreremoveFromSuperview
si nécessaire.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
}
}
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() }
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];
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];
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)];
}
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 ...
Le plus simple et le meilleur moyen est
for(UIView *subview in [scrollView subviews]) {
[subview removeFromSuperview];
}
for(subview) in self.scrollView.subviews {
subview.removeFromSuperview()
}