2009-06-16 3 views
10

탐색 스택에서 자식 뷰를 팝핑 한 후 iPhone에서 부모 뷰를 업데이트해야합니다. 자식이 스택에서 팝되어 부모가 다시 표시 될 때 알림을 받도록 부모 뷰를 설정하거나 자동 메서드 호출을 수신하려면 어떻게해야합니까?iPhone에서 스택에서 뷰 컨트롤러를 팝핑 한 후 자동으로 메서드를 호출하는 방법

사용자가 부모 페이지에 표시하려는 하위 페이지에 데이터를 입력하고 사용자가보기를 팝합니다.

도움 주셔서 감사합니다.

답변

13

방금이 동일한 문제를 해결했습니다. 위의 답변은 거의 정확하며 대표자를 설정하는 것을 잊어 버렸습니다.

목록 크기를 표시하고 목록 크기를 변경할 수있는 하위보기 컨트롤러를 호출하며 반환시 크기를 업데이트해야하는 루트보기 컨트롤러가 있습니다.

SettingsView *sv = [[SettingsView alloc] initWithNibName:@"SettingsView" bundle:nil]; 
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:sv]; 
[nc setDelegate:sv]; 
: - 내 부모 뷰 (아래 SettingsView)을 생성하고,은 UINavigationController의 루트보기로 추가하면, 내가보기를 표시하기 전에 UINavigationController가의 대리자를 설정해야합니다

은 키 부분 부모보기에서

의 UINavigationControllerDelegate 프로토콜 구현 :

@interface SettingsView : UIViewController <UINavigationControllerDelegate> 

을하고 willShowViewController 방법 제공 :

자식 뷰를 닫은 후 부모 뷰를 다시 표시하기 전에 호출됩니다.

+0

와우 덕분에 같은 문제가있었습니다. – drew010

+0

정답을 수락하는 것을 잊지 마십시오. –

+0

ur 관찰은 매우 중요합니다 .... unforgiven3 대답은 정확 합니다만, UllavigationControllerDelegate 프로토콜을 구현하지 않은 ViewController에서 urShowViewController를 호출하면 결코 작동하지 않을 것입니다. 또한 부모 ViewController가 "ViewController __strong to 호환되지 않는 유형의 매개 변수

6

나는 이와 같이해야 할 필요가있었습니다. 내 UINavigationController가을 소유 의 ViewController, 나는이 같은 willShowViewController을 구현했다 다음은 UINavigationController가 뷰를 변경할 때마다 메서드가 호출되는 것을

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
} 

. 귀하의 질문을 올바르게 이해하고 있다면 귀하가 원하는대로해야한다고 생각합니다.

3

여기에 약간의 혼란이 있다고 생각합니다. UIViewUINavigationController의 스택에 푸시되거나 터지 지 않습니다. 푸시되고 튀어 나오게되는 것은 UIViewControllers이며 차례로 하나 또는 더 자주 여러 개의 뷰를 처리합니다.

다행히 UIViewController 이러한 방법이 있습니다

-(void) viewWillAppear:(BOOL)animated; 
-(void) viewDidAppear:(BOOL)animated; 
-(void) viewWillDisappear:(BOOL)animated; 
-(void) viewDidDisappear:(BOOL)animated; 

뷰에 대해 때마다이 호출된다 (DIS)의 표시를하거나 (DIS)가 나타났다. 탭바, 모달 뷰 및 탐색 컨트롤러와 함께 작동합니다. (그리고 사용자 정의 컨트롤러를 구현할 때 이들을 사용하는 것이 좋습니다.)

따라서 올바르게 이해하면 viewWillAppear : 또는 viewDidAppear : 방법을 " 부모 페이지 "(아마도 UIViewController으로 처리됩니다)를 입력하고 입력 한 데이터를 반영하도록 페이지의 모양을 업데이트하는 코드를 입력하십시오.

(올바르게 기억하는 경우 나중에 메시지가 자식 컨트롤러로 전송되도록 메시지가 표시 될 때 UINavigationController 메시지를 가져와야합니다.) 템플릿 또는 IB에서는 아마도 걱정할 필요가 없을 것입니다.)

0

컨트롤러를 다른 컨트롤러에 알릴 필요가있는 경우 here (see 2nd answer)과 같은 위임 패턴을 사용할 수 있습니다.

설명 된대로 정확한 작업을위한 자동 알림 (AFAIK)이 없습니다. 귀하의 요구를 충족 시키려면 하위 컨트롤러의 viewWillDisappear 기능에서 대리인에게 (즉, 상위 컨트롤러로) 메시지를 보낼 수 있습니다.

+1

자녀 컨트롤러에 자식이있는 경우 성가 시게됩니다. 이 경우 자식이 팝업 될 때뿐만 아니라 자식이 손자를 푸시 할 때'viewWillDisappear'가 호출됩니다. 후자의 경우에만 부모에게 메시지를 보내시겠습니까? 나는 아직 그 문제에서 우아한 방법을 찾지 못하고있다. –

2

Felixyz 대답이 나를 위해 속임수를 사용했습니다. 뷰를 호출하면 메소드는 뷰가 나타날 때마다 코드를 실행합니다. 뷰와 다른 점은 뷰가 처음로드 될 때만 코드를 실행하는 load입니다. 부모 뷰는 자식 뷰가 부모에 표시된 정보를 변경하고 자루에서 튀어 나오면 자체를 업데이트하지 않습니다. 부모 호출 뷰가 표시되면보기가 백업 될 때마다 코드가 실행됩니다.

동시에 super 메소드를 호출해야합니다. 올바른 구현은 다음과 같습니다.

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    NSLog(@"View Appearing"); 
}