Ios 从其他类的超级视图中删除视图

Ios 从其他类的超级视图中删除视图,ios,objective-c,iphone,ipad,uiviewcontroller,Ios,Objective C,Iphone,Ipad,Uiviewcontroller,嗨,我有三个视图控制器。A、 B,C首先我在A下添加B,然后在B下添加C。在C视图控制器中,当点击按钮后C可见时,我想从超级视图中删除C,同时从超级视图中删除B。要从B中删除C,我使用以下代码 [self.view removeFromSuperview]; 我可以从B删除点击按钮的C。但是如何从C ViewController类中删除A中的B呢。所以,在点击C视图控制器中的按钮后,B、C都必须被移除&只有A应该可见 提前谢谢 您需要C和B或C和A之间存在某种依赖关系。简单地说,C需要通知B它

嗨,我有三个视图控制器。A、 B,C首先我在A下添加B,然后在B下添加C。在C视图控制器中,当点击按钮后C可见时,我想从超级视图中删除C,同时从超级视图中删除B。要从B中删除C,我使用以下代码

[self.view removeFromSuperview];
我可以从B删除点击按钮的C。但是如何从C ViewController类中删除A中的B呢。所以,在点击C视图控制器中的按钮后,B、C都必须被移除&只有A应该可见


提前谢谢

您需要C和B或C和A之间存在某种依赖关系。简单地说,C需要通知B它应该从它的超级视图中删除,或者A它应该删除它的子视图B


您可以通过协议或通知来实现这一点

UIView
具有属性
superview
,因此可以调用

[self.view.superview removeFromSuperview];
请务必阅读文档:


编辑:请记住,由于视图C是视图B的子视图,此代码将从a中删除C和B。

您应该使用委托。C是一个视图,父视图是B,所以B是关闭C的视图更为正确,B也是如此,a必须是关闭B的视图

为了做到这一点,您必须在C中实现一个协议,在B中实现另一个协议,如下所示:

@protocol ViewControllerCDelegate <NSObject>

    - (void)didSelectCloseViewC;

@end
- (void)didSelectCloseViewB {
       [self.viewB removeFromSuperView];
}
您必须对视图B和视图A重复这个过程,视图B将有它的协议,视图A将实现它。因此,在前面的方法中,您将最终获得以下结果:

- (void)didSelectCloseViewC {
       [self.viewC removeFromSuperView];
       [self.delegate didSelecCloseViewB];
}
在视图A中,您将实现视图B协议,如下所示:

@protocol ViewControllerCDelegate <NSObject>

    - (void)didSelectCloseViewC;

@end
- (void)didSelectCloseViewB {
       [self.viewB removeFromSuperView];
}

对于一个简单的任务来说,这有点过于复杂。RASS解决方案既简单又优雅。如果C的superview是B,B的superview是A,那么在C中调用
self.view.superview
应该可以得到B的引用。调用
self.view.superview.superview应该可以得到e.t.C的引用。我在C类中使用self.view.superview removefromsuperview从AOK中删除B,我刚刚在我正在做的iOS项目,效果很好。确保
self.view.superview!=零我建议不要从外部操纵另一个视图控制器的视图层次结构。相反,我会向父视图控制器(a)添加一个协议/消息,要求它删除B。从OO的角度来看,它更干净。使用此方法会产生什么问题?将B添加到a和C添加到B意味着将这些控制器的视图添加到相关的视图控制器视图。确保您没有按下控制器。