20

我已将子视图(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];

}
4

3 回答 3

51

快速而肮脏:给您的视图一个标签,以便您以后识别它:

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

一种更简洁、更快、更易于阅读和维护的替代方法是创建一个变量或属性来访问视图:

在界面中:

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

也就是说,请注意评论者关于使用其他 ViewController 的 View 的警告。如果您想这样做,请阅读ViewController 包含。

于 2012-05-03T16:30:58.543 回答
7

创建一个 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 而无需打开标题。

于 2012-05-03T16:27:46.270 回答
2

您可以简单地为您的视图设置一个唯一标签来标识它。然后当你想删除它。使用该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];
}
于 2012-05-03T16:32:47.217 回答