올바른 방법은 하위 컨트롤러가 주 컨트롤러에이를 제거하도록 요청하는 것입니다. 당신은 두 개의 컨트롤러 사이의 커플 링을 줄이려면, 당신의 subcontroller에 대한 위임 프로토콜을 만들 :
// This forward declaration avoids having a circular dependency
// between MySubcontroller and MySubcontrollerDelegate
@class MySubcontroller;
@protocol MySubcontrollerDelegate
- (void)hideMySubcontroller:(MySubcontroller*)subcontroller;
@end
을 subcontroller가 supercontroller와 통신하는 데 필요한 기타 정보가있는 경우,이 관련 추가 할 수있는 좋은 장소입니다 전화. 지금 당장 그렇게 할 필요는 없지만 이후 버전의 앱을 염두에 두시기 바랍니다.
그런 다음 subcontroller에
delegate
속성을 추가 :
@interface MySubcontroller : UIViewController {
id <MySubcontrollerDelegate> delegate;
...
}
@property (assign) id <MySubcontrollerDelegate> delegate;
...
@end
대신 해당 뷰에 removeFromSuperview
를 호출의 subcontroller는 인수로 self
을 통과, 그 위임에 hideMySubcontroller:
를 호출해야합니다.
메인 컨트롤러는 다음이 위임 프로토콜을 구현 함을 선언한다 :
메인 컨트롤러가 subcontroller를 생성
@interface MyMainController : UIViewController <MySubcontrollerDelegate>
...
@end
, 그것은 self
에 subcontroller의 delegate
속성을 설정해야합니다. 그것은 서브 컨트롤러의 뷰를 제거하고, 서브 컨트롤러를 할당 해제하고, 필요한 것이 무엇이든 수행하는 hideMySubcontroller:
메소드를 구현해야한다.
대리자 프로토콜을 사용한다는 것은 서브 컨트롤러가 어떤 종류의 개체를 사용할 지에 대한 지식이 필요 없다는 것을 의미합니다. 어딘가에 그러한 객체가 있다는 것을 알고 대리인 프로토콜을 따르게됩니다. 따라서 두 컨트롤러 간의 커플 링은 가능한 작게 유지됩니다.
그런데 그것을 관리 할 수 있다면 실제로 다시 사용할 필요가 있기 때문에 서브 컨트롤러를 계속 유지하는 것이 좋습니다. 다시 작성하는 데 걸리는 처리 시간이 절약됩니다. (그러나 메모리 경고를 받으면 해제해야합니다.)