从超级视图中删除当前视图

Posted

技术标签:

【中文标题】从超级视图中删除当前视图【英文标题】:Remove current view from superview 【发布时间】:2011-06-01 22:42:12 【问题描述】:

假设我有一个视图控制器“ViewBViewController”。在那个 viewcontroller 中,我创建了一个“ViewAViewController”的实例,并使用 addSubView: 方法来显示这个 ViewAViewController。然后它处理一堆信息,现在完成了。我希望它在完成后自动作为子视图删除。

我正在查看 removeFromSuperview 方法,但似乎无法从我要删除其视图的视图控制器中调用它(我的第一直觉是 [self.view removeFromSuperview],但这摆脱了整个视图,而不仅仅是我所追求的子视图)。

我能想到的唯一方法是设置一个委托协议,并让视图 B 代表视图 A 作为其代理来处理视图 A 的卸载。然而,这种方法似乎有点矫枉过正。我错过了更简单的解决方案吗?

提前致谢!

【问题讨论】:

【参考方案1】:

UIViewController 不响应removeFromSuperview,因为UIViewController 不是UIView 而是UIViewController。那里没有惊喜。您可以在任何视图上调用removeSuperview,例如与视图控制器关联的视图(此处为self):

[self.view removeFromSuperview];

或者如果您只想删除一个子视图:

[mySubview removeFromSuperview];

或者如果您的子视图是self 的成员(即在界面中声明):

[self.mySubview removeFromSuperview];

【讨论】:

【参考方案2】:

你试过了吗:setHidden: YES

【讨论】:

setHidden 有效,尽管我也让 [self.view removeFromSuperview] 工作。事实证明,在我的示例中加载“视图 B”的方式有问题。这使它看起来好像通过调用 removeFromSuperview 删除了所有视图。【参考方案3】:

这里有两个基本正确的解决方案:

使用导航控制器。如果您不希望它成为界面的一部分,可以隐藏导航栏。然后,您可以通过调用

从任一视图控制器处理顶部视图控制器及其视图
// argument can be YES or NO, as you like
[self.navigationController popViewControllerAnimated:YES];

使用委托调用告诉父视图控制器执行类似的操作

-(void)removeViewA 
    // remove the view from the view hierarchy
    [self.viewAController.view removeFromSuperview];
    // dispose of the view controller so it doesn't leak.
    self.viewAController = nil;

确保不会泄露子视图控制器及其视图,这一点很重要。

这两种方法都可以,但对我来说,使用导航控制器似乎更习惯。

【讨论】:

以上是关于从超级视图中删除当前视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时从超级视图中删除视图?

如何从超级视图中删除视图?

足以从超级视图中删除视图?

Swift 从超级视图中删除子视图

微调器不想从超级视图中删除

从单元格中的超级视图中删除视图