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

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

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

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

提前致谢!

【问题讨论】:

    标签: iphone ios


    【解决方案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;
        }
        

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多