2014-12-29 2 views
0

기본적으로 4 개의 일반보기 컨트롤러가 있고 그 중 하나는 주 콘텐트를 보유하고있는 '홈'보기 컨트롤러입니다. 다른 세 가지는 알림을 확인하고 새로운 콘텐츠를 만드는 등의 작업에 사용됩니다.이 문제는 - 집보기 컨트롤러를 한 번만로드하려는 경우 (앱이 시작될 때)보기 컨트롤러간에 이동할 때 '홈'컨트롤러보기 컨트롤러 사이에서 이동

[self dismissViewControllerAnimated:NO completion:nil]; 

이렇게하면 현재 컨트롤러가 항상 현재 컨트롤러 뒤에 있어야합니다. 그래서 모든 것을 요약 - 세 가지 컨트롤러의 다른 집에서 이동, 나는

UIViewController *vc=[self.storyboard instantiateViewControllerWithIdentifier:@"RepliesView"]; 
         [self presentViewController:vc animated:NO completion:nil]; 

와 컨트롤러를로드하고 내가 집에 세 가지 컨트롤러의 이동할 때 현재 뷰 컨트롤러를 닫습니다. 홈과 다른 하나의 컨트롤러 사이를 계속 움직이면 문제가되지 않지만 홈이 아닌 뷰 컨트롤러에서 홈이 아닌보기 컨트롤러로 이동할 때 문제가 발생하므로 기본적으로 컨트롤러를로드 한 다음 현재를 닫아야합니다. 하나는 적재 된 하나가 바로 뒤에있는 홈 컨트롤러를 가지고 있기 때문에 집으로 돌아갈 수 있습니다. 지금까지 나는 해고하고 나서 제시하려고 노력했다.

[self dismissViewControllerAnimated:NO completion:nil]; 
        UIViewController *vc=[self.storyboard instantiateViewControllerWithIdentifier:@"RepliesView"]; 
        [self presentViewController:vc animated:NO completion:nil]; 

그러나 이것은 '보기가 창 계층 구조에 없다!'라고 말한다. 경고 및 표시되는보기는 인스턴스화되는 것이 아니라 가정보기입니다.

[self dismissViewControllerAnimated:NO completion:^{ 
    UIViewController *vc=[self.storyboard instantiateViewControllerWithIdentifier:@"RepliesView"]; 
    [self.parentViewController presentViewController:vc animated:NO completion:nil]; 
}]; 

당신은 당신이를 제공하려고 노력하고 있기 때문에 문제가 발생하는 : 사람이이 작동하는지 해결책을 확인

+1

방금 ​​전에 해고 한보기 컨트롤러에서 프리젠 테이션을 할 수 없다는 것이 문제이므로, 집보기에서보기를 제시해야하거나 제시하지 않고 두 번째보기 만 표시하면되지만 돌아갈 때 두 개의보기 컨트롤러를 동시에 닫습니다. –

+0

그래서 다른보기 컨트롤러에서보기 컨트롤러를 닫을 수있는 방법이 있습니다. [self dismissView ...]가 아니라 [aViewController dismiss ...]? – RodMatveev

+0

난 그냥 2 행을 제시하고 홈보기 컨트롤러에 직접 기각해야한다고 생각합니다. –

답변

0

나는이 조금 살펴본 내 자신에 대한 몇 가지 실험을 해봤으므로 모달 뷰 컨트롤러를 사용해서는 안되는 작업을 수행하는 것처럼 보이지만 대신 뷰를 탐색 스택에 직접 추가해야합니다. presentViewController:dismissViewController: 대신 pushViewController:popViewController을 사용하십시오.

것은 그래서 코드의 원래 의도를 유지하기 위해, 당신은 사용하여 홈보기에서 모든 뷰 컨트롤러에 밀어 수 있습니다

UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"RepliesView"]; 
[self.navigationController pushViewController:vc animated:NO]; 

다음

[self.navigationController popViewControllerAnimated:NO]; 

사용하거나

을 사용하거나 사용 기각
[self.navigationController popToRootViewControllerAnimated:NO]; 

스택의 모든보기 컨트롤러에서 "홈"보기 컨트롤러가 r이면 oot 뷰 컨트롤러.

그런 기각하고 현재 수행하려는 방법으로 즉시 현재, 즉시 스택의 유지 복사본에서 팝업보다 밀어 수만큼 당신이하지 않는

UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"RepliesView"]; 
UINavigationController *navController = self.navigationController; 

[navController popViewControllerAnimated:NO]; 
[navController pushViewController:vc animated:NO]; 

및 전환 효과를 적용하려면이 방법이 효과적입니다.

전환 효과를 적용하려면 vc으로 즉시 푸시 한 다음 '홈'보기로 돌아갈 준비가되었을 때 popToRootViewControllerAnimated:을 수행 할 것을 권합니다.

+0

내가 잘못했는지 확실하지 않지만이 작업을 수행 할 수 없습니다. appDelegate에서 홈 컨트롤러를 루트 컨트롤러로 설정하고 홈으로 돌아가려면 뷰 컨트롤러를 팝업하려고 할 때 아무 것도 일어나지 않을 것입니다 (따라서 전환이 일어나지 않습니다). – RodMatveev

+0

@RodMatveev 전환에 pushViewController를 사용하고 있습니까? –

+0

popViewController를 사용하여 현재 컨트롤러를 제거하고 홈 컨트롤러로 이동해야한다고 생각했기 때문에 집으로 돌아 가지 않았습니다. – RodMatveev

0

100 %를 제안하지만,이 시도를 줄 수 있다면 좋지 않을까 이미 해산 된 vc로부터의 vc. 그러나 당신이 해산 vc의 부모 vc에서 그것을 제시한다면, 그 속임수를 할 수도있다.

EDIT : 이것이 약간의 해킹으로 작동 할지는 모르겠지만 한 번 볼만한 가치가있다.

[self dismissViewControllerAnimated:NO completion:^{ 
    UIViewController *vc=[self.storyboard instantiateViewControllerWithIdentifier:@"RepliesView"]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ViewControllerDidDismiss" object:vc]; 
}]; 

을 그리고 홈 뷰 컨트롤러에서 notificaiton 수신 : 집없는 뷰 컨트롤러의 각에서, 그래서처럼 그들을 해고

[[NSNotificationCenter defaultCenter] addObserverForName:@"ViewControllerDidDismiss" 
                object:nil 
                queue:[NSOperationQueue currentQueue] 
               usingBlock:^(NSNotification *note) { 
                UIViewController *vc = [note object]; 
                [self presentViewController:vc animated:NO completion:nil]; 
               }]; 
+0

나는 이것을 시도했지만, 'RepliesView'대신에 'home'컨트롤러가 나타나기 전에 – RodMatveev

+0

@RodMatveev 나는 당신이 시도해 볼 또 다른 아이디어를 내놓았다. 내 편집을 참조하십시오 – Chris

+0

이것이 작동하지만 repliesView가 나타나기 전에 실제로 홈 컨트롤러를 볼 수 있습니다 (약 반 초 동안 깜박임).이 문제를 해결할 수있는 방법이 있습니까? – RodMatveev