web-dev-qa-db-fra.com

Comment supprimer les sous-vues dans Objective-C?

J'ai ajouté UIButton et UITextView comme sous-vues à ma vue par programme.

notesDescriptionView = [[UIView alloc]initWithFrame:CGRectMake(0,0,320,460)];
notesDescriptionView.backgroundColor = [UIColor redColor];
[self.view addSubview:notesDescriptionView];

textView = [[UITextView alloc] initWithFrame:CGRectMake(0,0,320,420)]; 
[self.view addSubview:textView]; 
printf("\n description  button \n");

button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button
  addTarget:self action:@selector(cancel:)
  forControlEvents:UIControlEventTouchDown];
[button setTitle:@"OK" forState:UIControlStateNormal];
button.frame = CGRectMake(80.0, 420.0, 160.0, 40.0);
[self.view addSubview:button];

Je dois supprimer toutes les sous-vues lorsque le bouton est cliqué.

J'ai essayé:

[self.view removeFromSuperView]

mais ça ne marche pas.

26
mac

Je suppose que vous appelez [self.view removeFromSuperView] à partir d'une méthode de la même classe que l'extrait ci-dessus.

Dans ce cas [self.view removeFromSuperView] supprime self.view de sa propre vue d'ensemble, mais self est l'objet dont vous souhaitez supprimer les sous-vues. Si vous souhaitez supprimer toutes les sous-vues de l'objet, vous devez le faire à la place:

[notesDescriptionView removeFromSuperview];
[button.view removeFromSuperview];
[textView removeFromSuperview];

Vous voudrez peut-être stocker ces sous-vues dans un NSArray et faire une boucle sur ce tableau en invoquant removeFromSuperview sur chaque élément de ce tableau.

21
Frank Shearar

pour supprimer toutes les sous-vues que vous avez ajoutées à la vue

utilisez le code suivant

for (UIView *view in [self.view subviews]) 
{
    [view removeFromSuperview];
}
58
mac

J'ai toujours été surpris que l'API Objective-C n'ait pas de méthode simple pour supprimer toutes les sous-vues d'une UIView. (L'API Flash le fait, et vous finissez par en avoir besoin un peu.)

Quoi qu'il en soit, voici la petite méthode d'aide que j'utilise pour cela:

- (void)removeAllSubviewsFromUIView:(UIView *)parentView
{
  for (id child in [parentView subviews])
  {
    if ([child isMemberOfClass:[UIView class]])
    {
      [child removeFromSuperview];
    }
  }
}

EDIT: viens de trouver une solution plus élégante ici: Quelle est la meilleure façon de supprimer toutes les sous-vues de vous self.view?

J'utilise maintenant comme suit:

  // Make sure the background and foreground views are empty:
  [self.backgroundContentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
  [self.foregroundContentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

J'aime mieux ça.

8
Erik van der Neut