正確的方法是您的子控制器要求主控制器將其刪除。如果你想減少這兩個控制器之間的耦合,創建一個委託協議,爲您的子控制器:
// 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:
方法,它刪除子控制器的視圖,取消分配子控制器,並執行其他任何需要的操作。
使用委託協議意味着子控制器不必知道使用哪種對象;它只是知道在某個地方存在這樣的對象,並且它將符合委託協議。因此,兩個控制器之間的耦合儘可能小。順便說一下,如果你可以管理它,實際上最好保留子控制器以防需要再次使用它;這將節省重新創建它所需的處理時間。 (但是,如果收到內存警告,則應釋放它。)