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