Как удалить конкретное подвью?
Я добавил subview (ViewController) в свой ViewController:
Location *location = [[Location alloc] initWithNibName:@"Location" bundle:[NSBundle mainBundle]];
[self.subView addSubview:location.view];
Как я могу удалить этот под просмотр?
Я знаю, что для удаления всех подзапросов есть:
for (UIView *subview in [self.view subviews]) {
[subview removeFromSuperview];
}
Ответы
Ответ 1
Быстрая и грязная:. Дайте вашему тегу просмотр, чтобы впоследствии его определить:
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.
Ответ 2
Создайте 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, не открывая заголовок.
Ответ 3
Вы можете просто установить уникальный тег для своего представления, которое идентифицирует его. И затем, когда вы хотите удалить его. Используйте метод 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];
}