Как удалить конкретный 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];
}