如何删除特定的子视图?

iWi*_*ard 20 iphone objective-c subview

我已将subview(ViewController)添加到我的ViewController:

Location *location = [[Location alloc] initWithNibName:@"Location" bundle:[NSBundle mainBundle]];
[self.subView addSubview:location.view];
Run Code Online (Sandbox Code Playgroud)

我怎样才能删除这个子视图呢?

我知道删除所有子视图是:

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

  [subview removeFromSuperview];

}
Run Code Online (Sandbox Code Playgroud)

fzw*_*zwo 50

快速和脏:为您的视图添加标记,以便稍后识别它:

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];
Run Code Online (Sandbox Code Playgroud)

然后,删除:

UIView *viewToRemove = [self.view viewWithTag:17];
[viewToRemove removeFromSuperview];
Run Code Online (Sandbox Code Playgroud)

一个更清洁,更快速,更容易阅读和维护备选方案是创建一个变量或属性访问视图:

在界面中:

@property (nonatomic, weak) UIView *locationView;
Run Code Online (Sandbox Code Playgroud)

在实施中:

Location *location = [[Location alloc] initWithNibName:@"Location" bundle:[NSBundle mainBundle]];
UIView *viewToAdd = location.view;
self.locationView = viewToAdd;
[self.view addSubview:viewToAdd];
Run Code Online (Sandbox Code Playgroud)

然后,删除:

[self.locationView removeFromSuperview];
Run Code Online (Sandbox Code Playgroud)

也就是说,听取评论者关于玩其他ViewControllers视图的警告.如果您想这样做,请阅读ViewController包含.

  • 因为这回答了一般问题,所以提问者无需引入iVars或更改除了这两个调用之外的任何其他内容.我很少标记我的观点(如果是这样,主要用于调试),但在这里它最终有用. (2认同)

Pau*_*l.s 7

创建一个ivar,它可以为您提供对新viewController或仅视图的引用.我将在这里找到viewController

添加属性并进行综合

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

// .m
@synthesize location = _location;
Run Code Online (Sandbox Code Playgroud)

现在,当您创建位置设置ivar时

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

[self.subView addSubview:location.view];
Run Code Online (Sandbox Code Playgroud)

现在稍后将其删除

[self.location.view removeFromSuperview];
Run Code Online (Sandbox Code Playgroud)

边注

通常,将视图控制器的视图添加到另一个视图中是一条痛苦的道路.对于一些关于此的轻读,请参阅滥用UIViewControllers

你的命名Location可能不是很好,把它称为类似LocationViewController或类似的东西可能更合适.以这种方式进行一致的命名允许任何其他人(或将来你)能够轻松阅读并掌握这是一个viewController而无需打开标题.