2011-02-22 5 views
1

보기 기반 응용 프로그램이 있고 그 하위보기가 제거 될 때 superview (부모보기)에서 메서드를 호출하려고합니다. 1) both (parent, sub) 뷰는 UIViewController 하위 클래스 입니다. 2) [self.view addSubview : subviewController];로 서브 뷰를 추가했습니다. 3) 부모로부터 하위 뷰를 제거합니다. [self.view removeFromSuperview];iPhone 하위보기에서 부모보기의 메서드를 호출하는 방법

누구든 도와주세요.

답변

4

용어에 대해 약간 혼란스러운 것 같습니다. UIViews와 UIViewController는 별도의 것들입니다. 뷰 컨트롤러에는보기가 있습니다. 뷰는 무언가가 제거되었을 때 알 수 있습니다.이 경우 뷰 컨트롤러가 무언가가 뷰에서 제거되면이를 알기를 원합니다.

프로그램의 클래스 계층 구조에 대한 다른 가정없이 가장 좋은 방법은보기 컨트롤러를 대리자로 유지하고 무언가를 제거 할 때이를 알리는 사용자 지정 하위 클래스 UIView를 만드는 것입니다. 그 중 하나를 부모보기로 사용하고 부모보기 컨트롤러를 위임자로 지정하십시오.

부모보기 컨트롤러가 메시지를 가져올 때 제거 될보기와 하위보기 컨트롤러에 속한보기를 비교합니다. 그들이 일치하면 당신은 당신이 원하는 것을 얻었습니다.

예 UIView의 서브 클래스, 인터페이스 :

@protocol UIViewThatNotifiesViewControllerDelegate 
- (void)view:(UIView *)view willRemoveSubview:(UIView *)subview; 
@end 

@interface UIViewThatNotifiesViewController: UIView 
{ 
    UIViewController <UIViewThatNotifiesViewControllerDelegate> *delegate; 
} 

@property (nonatomic, assign) UIViewController <UIViewThatNotifiesViewControllerDelegate> *delegate; 
@end 

구현 : 부모 뷰 컨트롤러의 현재보기를 가정

@implementation UIViewThatNotifiesViewController 

@synthesize delegate; 

- (void)willRemoveSubview:(UIView *)subview 
{ 
    [delegate view:self willRemoveSubview:subview]; 
    [super willRemoveSubview:subview]; 
} 

@end 

이 될 수 (인터페이스 빌더와 엑스 코드에서) 변경, 형식의 UIView이다 형식의 UIViewThatNotifiesViewController입니다. 보기 컨트롤러가 UIViewThatNotifiesViewController 프로토콜을 구현하여 컴파일러 경고를 피하도록 선언하십시오. 그런 다음 뷰 컨트롤러에 이런 식으로 뭔가를 추가

- (void)view:(UIView *)view willRemoveSubview:(UIView *)subview 
{ 
    if(subview == subviewController.view) 
    { 
     NSLog(@"his view is in the process of being removed"); 
    } 
} 

이런 종류의 작업을 수행하는 문체 더 일반적인 방법은 각 뷰 컨트롤러는 정보의 전체 화면 전체를 관리하는 것입니다. 따라서 뷰를 다른 뷰에 추가하지 마십시오. 대신 presentModalViewController를 사용하여 한 컨트롤러에서 다른 컨트롤러로 컨트롤을 전달하고 dismissModalViewController : 자식을 부모와 관계없이 해제 할 수 있도록 [self.parentViewController dismissModalViewController : ...]를 사용하여 다시 전달합니다. 그런 다음보기 컨트롤러 메소드 viewWillAppear, viewDidAppear, viewWillDisappear 및 viewWillAppear를 사용하여 표시 여부를 전환할지 여부를 결정할 수 있습니다.

+1

좋은 답변입니다. "각보기 컨트롤러가 전체 화면을 관리하게하십시오"라는 스타일을 추가하는 것뿐입니다. UIViewController는 화면을 채우는 것으로 가정하고 Apple은 컨테이너보기 컨트롤러로 해당 규칙을 해결할 수 있지만 그렇게하지는 마십시오. 뷰 컨트롤러를 중첩하면 버그가 발생하고 예기치 않은 동작이 발생하며 새로운 개발자에게는 공통적 인 문제로 보입니다. – Jonah

+0

안녕하세요, 당신의 대답을 주셔서 감사합니다, 나는 별도의 파일을 NotificationDelegate.h 선언 프로토콜, 어디 선언 할 함수 - (void) 알림 추가 및 id delegate; 하위 뷰 컨트롤러에서 (속성 및 구현 클래스에서 합성), 내가 정의한 function - (void) parentviewcontroller implementaion 클래스의 알림,하지만 함수 - (vod) 호출하지 않음 – Senthil

+0

willRemoveSubview를 사용해야합니다. 메서드 UIView는 재정의해야하는 자체를 호출합니다. 인터페이스 빌더와 Xcode에서 정의한 새로운 서브 클래스로 뷰를 설정했는지 확인 했습니까? – Tommy

관련 문제