Как удалить подпредставления в Objective-C? - PullRequest
24 голосов
/ 09 июня 2010

Я добавил UIButton и UITextView в качестве подпредставлений к моему представлению программно.

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

Мне нужно удалить все подпредставления при нажатии кнопки.

Я пробовал:

[self.view removeFromSuperView]

но это не работает.

Ответы [ 3 ]

58 голосов
/ 09 июня 2010

чтобы удалить все подпредставления, которые вы добавили в представление

, используйте следующий код

for (UIView *view in [self.view subviews]) 
{
    [view removeFromSuperview];
}
21 голосов
/ 09 июня 2010

Я предполагаю, что вы вызываете [self.view removeFromSuperView] из метода того же класса, что и приведенный выше фрагмент.

В этом случае [self.view removeFromSuperView] удаляет self.view из своего собственного суперпредставления, но self является объектомс чьей точки зрения вы хотите удалить подпредставления.Если вы хотите удалить все подпредставления объекта, вам нужно сделать это вместо этого:

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

Возможно, вы захотите сохранить эти подпредставления в NSArray и выполнить цикл по этому массиву, вызывая removeFromSuperview на каждый элемент в этом массиве.

7 голосов
/ 21 февраля 2014

Меня всегда удивляло, что в Objective-C API нет простого метода удаления всех вложенных представлений из UIView. (Flash API делает, и вам это понадобится совсем немного.)

В любом случае, это маленький вспомогательный метод, который я использую для этого:

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

РЕДАКТИРОВАТЬ: только что нашел более элегантное решение здесь: Каков наилучший способ удалить все подпредставления из вашего self.view?

Использую это сейчас следующим образом:

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

Мне это нравится больше.

...