2015-01-23 5 views
0

세 개의 UIViewController (A, B 및 C라고 부름)가 탐색 컨트롤러에 있습니다. A는 B 또는 C 중 하나로 전환 할 수 있습니다. B는 C로 전환 할 수 있습니다. C가 닫히면 항상 A로 돌아갑니다. B에서 열 경우 C를 닫으면 B가 자동으로 닫힙니다.아이에게 uiviewcontroller ios 후에 segue를 닫으십시오?

이제 시도해 보았습니다. C 닫을 때, B의 반환 방법은 대상 컨트롤러를 해제 불려 가도록 (듯이), 청산 SEGUE를 사용하여 :

- (IBAction)returnFromC:(UIStoryboardSegue*)segue 
{ 
    [segue.destinationViewController dismissViewControllerAnimated:YES completion:nil]; 
} 

나는이 방법에 중단 점을 넣어 - 그것은이라고합니다. destinationController가 실제로 B라는 것을 확인했습니다. 그러나 중단 점이 나올 때 C가 계속 표시됩니다. 중단 점에서 재생 한 후 C가 예상대로 종료되지만 B는 계속 표시됩니다.

아이디어가 있으십니까? 미리 감사드립니다.

답변

3

C가 닫힐 때, 나는 자동으로 C를 닫을 B를 닫습니다 즉, B에서 열 경우 항상, A를 반환 할

가장 간단한 해결 방법은 다음과 같습니다 C의 viewDidAppear:은 비밀리에 B를 제거에 네비게이션 컨트롤러의 자식으로 C는 A.이에서

A > C 

따라서, 유일으로 돌아 가야 : 당신이있어 수 있도록

A > B > C 

이제 당신이 일을 재 배열 : 즉, 당신이있어

이렇게하면 탐색 컨트롤러의 하위 집합을 쉽게 조작 할 수 있습니다. setViewControllers:animated: (NO의 두 번째 인수 사용)으로 전화하십시오.

[설정을 제대로 이해했다면 B에서가 아닌 A에서 unwind 메서드를 구현하는 것이 더 쉬운 방법입니다. 그런 다음 unwind segue를 수행하십시오. 즉 항상

+2

실제로 이렇게하는 방법은 탐색 컨트롤러의 'viewControllers' 속성의 변경 가능한 복사본을 만들고 컨트롤러를 제거한 다음 배열을 다시 탐색 컨트롤러에 할당하는 것입니다. – mszaro

+0

A에서 unwind 메서드를 사용하라는 제안을 사용했습니다. unwind가 여러 VC에서 작동한다는 것을 이해하지 못했습니다. 빠른 응답에 많은 감사드립니다. – iht

+0

@iht 매우 근사합니다. 해제는 매우 복잡하고 강력하며 구성이 쉽고 unwind 메서드의 배치는 해당 구성에서 가장 간단하고 기본적인 부분입니다. 그것은 그 작은 단서가 당신을 위해 그것을 해결하기에 충분했다는 점이 좋습니다! – matt

0

dismissViewControllerAnimated:completion:모달을 SEGUE 기각하는 데 사용 푸시에 대한 효과가

로를 segues 없습니다입니다] A. 것, 그래서 우리는 항상, 언 와인드 방법을 포함하는 첫 번째보기 컨트롤러에 긴장 @ 매트는 그냥 B (중간) self.navigationController.viewControllers에서보기 컨트롤러를 제거 할 수 있습니다 제안 여기에 당신이 B 뷰 컨트롤러에 넣을 수있는 샘플 코드입니다 :

- (void)viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 

    // No need to process if the viewController is already being removed 
    if (!self.isMovingFromParentViewController) { 
     // Getting a mutable copy of the viewControllers (can't directly modify) 
     NSMutableArray *temp = [self.navigationController.viewControllers mutableCopy]; 

     // Removing 'self' -> so A > B > C will become A > C 
     [temp removeObject:self]; 

     // Setting the new array of viewControllers 
     self.navigationController.viewControllers = [temp copy]; // getting an immutable copy 
    } 
} 

PS 데이터를 다시 보내지 않으려면 언로드 세그먼트 대신 popViewControllerAnimated:을 사용할 수 있습니다.