从超级视图中删除当前视图
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;
确保不会泄露子视图控制器及其视图,这一点很重要。
这两种方法都可以,但对我来说,使用导航控制器似乎更习惯。
【讨论】:
以上是关于从超级视图中删除当前视图的主要内容,如果未能解决你的问题,请参考以下文章