Как удалить конкретный subview?

я добавил subview (ViewController) в мой ViewController:

Location *location = [[Location alloc] initWithNibName:@"Location" bundle:[NSBundle mainBundle]];
[self.subView addSubview:location.view];

Как я могу удалить этот subview?

Я знаю, что для удаления всех подпанелей:

for (UIView *subview in [self.view subviews]) {

  [subview removeFromSuperview];

}

3 ответов


быстрый и грязный: дайте вашему взгляду тег, чтобы вы могли позже идентифицировать его:

Location *location = [[Location alloc] initWithNibName:@"Location" bundle:[NSBundle mainBundle]];
UIView *viewToAdd = location.view;
viewToAdd.tag = 17; //you can use any number you like
[self.view addSubview:viewToAdd];

затем, чтобы удалить:

UIView *viewToRemove = [self.view viewWithTag:17];
[viewToRemove removeFromSuperview];

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

интерфейс:

@property (nonatomic, weak) UIView *locationView;

в реализации:

Location *location = [[Location alloc] initWithNibName:@"Location" bundle:[NSBundle mainBundle]];
UIView *viewToAdd = location.view;
self.locationView = viewToAdd;
[self.view addSubview:viewToAdd];

затем, чтобы удалить:

[self.locationView removeFromSuperview];

что сказал, прислушаться предупреждения от комментаторов об игре с представлениями других ViewControllers. Читайте на сдерживание ViewController если вы хотите сделать это.


создайте ivar, который либо дает вам ссылку на новый viewController, либо просто представление. Я пойду за viewController здесь

добавить свойство и синтезировать его

// .h
@property (nonatomic, strong) Location *location;

// .m
@synthesize location = _location;

теперь при создании местоположения установите ivar

Location *location = [[Location alloc] initWithNibName:@"Location" bundle:[NSBundle mainBundle]];
self.location = location;

[self.subView addSubview:location.view];

теперь позже, чтобы удалить его

[self.location.view removeFromSuperview];

Примечание

как правило, это болезненный путь, чтобы добавить вид контроллера в представление другой такой. Для некоторого света читая об этом см. Злоупотребление UIViewControllers

ваш именование Location вероятно, не отлично, может быть, более уместно назвать это чем-то вроде LocationViewController или аналогичные. Последовательное именование таким образом позволяет любому другому (или будущему вам) легко читать и понимать, что это viewController без открытия заголовка.


вы можете просто установить уникальный тег для вашего представления, который идентифицирует его. А потом, когда вы захотите его удалить. Используйте viewWithTag:(NSInteger)tag метод, чтобы вернуть его и удалить только этот.

Location *location = [[Location alloc] initWithNibName:@"Location" bundle:[NSBundle mainBundle]];
location.tag = 8001; // 8001 is an exemple
[self.subView addSubview:location.view];

а то

UIView * v = [self.subView viewWithTag:8001];
if (nil != v) {
    [v removeFromSuperview];
}