正确的方法是让你的子控制器请求主控制器移除它。如果你想减少两个控制器之间的耦合,为你的子控制器创建一个委托协议:
// This forward declaration avoids having a circular dependency
// between MySubcontroller and MySubcontrollerDelegate
@class MySubcontroller;
@protocol MySubcontrollerDelegate
- (void)hideMySubcontroller:(MySubcontroller*)subcontroller;
@end
如果有其他信息需要子控制器与超控制器进行通信,这里是添加相关调用的好地方。您可能不需要立即这样做,但请记住您的应用的未来版本。
然后给子控制器添加delegate属性:
@interface MySubcontroller : UIViewController {
id <MySubcontrollerDelegate> delegate;
...
}
@property (assign) id <MySubcontrollerDelegate> delegate;
...
@end
子控制器不应在其视图上调用removeFromSuperview,而是应在其委托上调用hideMySubcontroller:,并将self 作为参数传递。
然后你的主控制器应该声明它实现了委托协议:
@interface MyMainController : UIViewController <MySubcontrollerDelegate>
...
@end
主控制器创建子控制器时,应将子控制器的delegate属性设置为self。它应该实现一个hideMySubcontroller: 方法,该方法删除子控制器的视图,释放子控制器,并执行其他任何需要的操作。
使用委托协议意味着子控制器不必知道什么样的对象会使用它;它只知道某处存在这样的对象并且它将符合委托协议。因此,两个控制器之间的耦合尽可能小。
顺便说一句,如果你可以管理它,实际上最好保留子控制器以防你需要再次使用它;这将节省重新创建它所需的处理时间。 (但是,如果您收到内存警告,您应该释放它。)