2014-11-05 2 views
0

ViewControllerA, ViewControllerB 및 ViewControllerC 순으로 세 개의보기 컨트롤러가있는 응용 프로그램에서 작업하고 있습니다. 특정 상황에서 사용자가 ViewControllerA에서 ViewControllerC로 바로 가야하지만 불행히도 ViewControllerC로 전환하는 동안 ViewControllerB가 화면에 잠깐 나타납니다. 원하지 않는 부분이 있습니다.iOS에서보기 컨트롤러를 밀어 넣을 때 스택의보기 컨트롤러를 우회하는 데 어려움이 있음

내부 VCA :

가 여기에 내가 함께 일하고 코드입니다 제가 위에서 언급 한 바와 같이

ViewControllerB *vcB = [ViewControllerB new]; 
    ViewControllerC *vcC = [ViewControllerC new]; 
    vcB.rootViewController = self; 
    [self.navigationController pushViewController:vcB animated:NO]; 
    [self.navigationController pushViewController:vcC animated:YES]; 

은, 위의 코드는 ViewControllerA에 내부에서 무슨 일이 일어나고, 나는 ViewControllerC 얻을 수 있어요, 문제는 안타깝게도 ViewControllerB가 전환 중에 잠시 표시된다는 것입니다. 아무도 내가 잘못하고있는 것을 볼 수 있습니까? 이것을 해결하기 위해해야 ​​할 일은 무엇입니까?

미리 답변 해 주신 모든 분께 감사드립니다.

답변

3

심플. 다음은 기존 뷰 스택을 원하지 않는 경우, 당신은 단지 그것을 멀리 던져 아마도 애니메이션 고장을 일으킬 것이다 그러나 자신의 배열을 만들 수 있습니다 분명히 어떤 거의-올바른-의사에게

NSMutableArray *vcStack = [NSMutableArray arrayWithArray:self.navigationController.viewControllers]; 
[vcStack addObject:vcB]; 
[vcStack addObject:vcC]; 
[self.navigationController setViewControllers:vcStack animated:YES]; 

을합니다. 추가 정보를 UINavigationController가에 대한 문서 밖으로

점검 : https://developer.apple.com/library/ios/documentation/Uikit/reference/UINavigationController_Class/index.html#//apple_ref/occ/instm/UINavigationController/setViewControllers:animated :

+0

안녕하세요, Matt, 귀하의 솔루션에 대해 대단히 감사합니다. 솔루션이 왜 효과가 있는지 설명해 주시겠습니까? 제 질문은, 현재 스택 (예 : vcStack)과 현재 스택이 같지 않은 이유입니다. 그렇다면이 작업이 왜 작동하며 이전 스택을 사용하지 않는 이유는 무엇입니까? – syedfa

+1

안녕하세요 syedfa - 우리가 vcStack을 만드는 이유는 self.navigationController.viewControllerers가 읽기 전용이기 때문에 뷰 스택을 직접 수정할 수 없기 때문입니다. 따라서 포인터를 가변 배열로 복사하고 수정 한 다음 (이 경우 두 VC 추가) 한 번에 전체 스택을 설정해야합니다. 그 질문에 대답합니까? –

+0

정말. 내 질문에, 왜 스택을 수정하는 것 같아요? 이것이 문제가되는 이유는 무엇입니까? 특히 두 개의 View Controller를 동일한 순서로 삽입 할 때 특히 그렇습니다. – syedfa

0

A에서 C로 직접 이동해야합니까?

그럼 그냥 또한 B를 밀어 필요가 ... 없다 [self.navigationController pushViewController:vcC animated:YES];

사용하거나 순서를 유지해야합니까?

+0

사용자가 C에서 뒤로 버튼을 누른 다음 예를 선택하면 B로 이동해야합니다. 건너 뛰기는 거꾸로가 아니라 앞으로 진행됩니다. – syedfa

+0

[self.navigationController addChildViewController : vcB] then C로 푸시 –

+0

답변에 선이 나옵니까? 그래서 그것은 다음과 같습니다 : [self.navigationController addChildViewController : vcB]; 그렇다면 [self.navigationController pushViewController : vcC animated : YES]; ? – syedfa

1

당신은 vcC을 밀어 번 vcC 화면에 완전히이다, 조용히 vcA 전에 vcB를 삽입하는 스택을 수정할 수 있습니다.

ViewControllerB *vcB = [ViewControllerB new]; 
ViewControllerC *vcC = [ViewControllerC new]; 
[self.navigationController pushViewController:vcC animated:YES]; 

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
    NSMutableArray *viewControllers = [self.navigationController.viewControllers mutableCopy]; 
    NSInteger indexOfC = [viewControllers indexOfObject:vcC]; 
    [viewControllers insertObject:vcB atIndex:indexOfC]; 
    [self.navigationController setViewControllers:viewControllers animated:NO]; 
}); 
관련 문제