1

여기에서 매우 흥미로운 문제가 있습니다. 내 iPhone 앱에는 AppDelegate에서 rootViewController로 UITabbarController가 있습니다.UITabbarController 모달 UINavigationController 닫기

앱을 처음 열면 기본적으로 구성되어야합니다. 이를 위해 나는은 UINavigationController를 만들고 모달을 제시하기 위해 tabbarController 알려주기 :

firstRun = [[firstRunViewController alloc] init]; 
navCtrl = [[UINavigationController alloc] initWithRootViewController:firstRun]; 
[[self tabBarController] presentModalViewController:navCtrl animated:NO]; 

구성이 완료되면, 나는 firstRunViewController 제거하고 싶습니다. 이 기술을 매우 자주 사용하고 있는데 -dismissModalViewControllerAnimated:을 사용하고 있습니다.

하지만이 별자리에서는 작동하지 않습니다. 내가 멸망이라고 부르는 컨트롤러는 중요하지 않습니다. tabbarController, rootViewController, 현재 활성화 된 viewController를 통해 자체 및 다른 여러 컨트롤러를 시도했습니다.

'UIViewControllerHierarchyInconsistency', reason: 'presentedViewController for controller is itself on dismiss for: <UINavigationController:… 

아무도 도와 드릴까요 :

내가 -dismissModalViewControllerAnimated:를 호출 할 때마다 나는이 예외가? 종류 안부 사전에 감사합니다, 줄리안

내가 메인 윈도우에 대한 rootViewController로 UITabBarController가 사용하고 내 AppDelegate에에서 편집 :

self.window.rootViewController = self.tabBarController; 
[self.window makeKeyAndVisible]; 

그럼 내가 UINavigationController가를 생성하고 말거야 지금 -dismissModalViewControllerAnimated를 호출 할 때

UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:firstRun]; 
[[self tabBarController] presentModalViewController:navCtrl animated:NO]; 

이 : 다음 firstViewController에 내가 오류 FR 받고 있어요 UITabBarController가이 modalViewController을 제시 위의 옴.

답변

1

드디어 답을 찾았습니다! 나는 나무의 나무를 볼 수 없었다! 나는 지금 아주 행복하다! :)

나는 정말로 어리석은 일을했다 : 설정 viewController의 마지막 viewController에서 사용자가 관리자인지 아닌지에 따라 tabars viewController를 변경해야했다. 그래서 내가 한 :

appDelegate.tabBarController.viewControllers = [NSArray arrayWithObjects:appDelegate.readState, 
               appDelegate.navCtrl, 
               appDelegate.settings, nil]; 

당신은 내가 TabBar의의 viewControllers에 AppDelegate에의 "navCtrl"을 추가 한 것을 볼 수 있습니다. 그래서 방금 parentViewControllers (UITabbarController) 하위 컨트롤러에 추가 한 viewController를 닫으려고했습니다.

마치 내가 같은 순간에 선물하고 싶은 것을 해고하는 것은 바람직하지 않습니다! :))

1

내 생각에 당신은 UITabbarController를 악용하고 있습니다. 이 클래스는 비록 UIViewController의 하위 클래스가 실제로 UIViewController 인프라를 많이 사용하지는 않습니다.

원하는 것은 지금 가지고있는 것을 약간 확장 한 것입니다. appDelegate에 새 UIViewController 하위 클래스를 만들고이를 배열에 단일 객체로 추가하고 tabBar의 viewController를이 배열로 설정합니다. 하위 클래스의 hidesBottomBarWhenPushed를 YES로 설정하여 표시 될 때 탭 표시 줄을 숨 깁니다.

이제 앱이 실행되고 UIViewController 하위 클래스가 맨 앞에 표시됩니다. 이보기를 모달로 표시하려는보기로 만들거나 특정 종류의 애니메이션을 사용하여 서브 클래스의보기를 표시 할 수 있습니다. 아, 그리고 발사 시점을 당신의 서브 클래스의 배경 이미지로 사용한다면, 당신은 이것을 부드럽게 전환시킬 수 있습니다 - 지금 이걸하십시오.

모달보기가 완료되면 표시 할보기를 인스턴스화하고 tabBarController.viewControllers (또는 애니메이션 버전)에서 해당보기를 사용하도록 UITabBarController를 설정할 수 있습니다. 똥, UIViewController 대체 할 것이다 (그리고 ARC 그냥 사라집니다).

+0

이런 종류의 작품 ...하지만 애니메이션을 적용 할 수 없습니다. 마지막 모달 viewController에 [UIView animateWithDuratio :]를 추가하려고했습니다. 그러나 애니메이션은 나타나지 않습니다. –

+0

정말 문제가 무엇인지 이해하고 싶습니다. 내가하는 것처럼 modalViewController (daily business)를 보여주기 때문에 login-viewController를 보여줄 것이다. 문제는 하나의 인스턴스가 더 있다고 생각합니다. navigationController ... –

1

가설을 테스트 할 기회가 없지만이 문제가 너무 일찍 표시된다는 사실에 달려 있다고 생각합니다. 너무 일찍 표시되면 주 창에 탭 막대 컨트롤러를 설정하십시오.그래서,이 제안이 변경 : 비동기 위의 방법을 appDidFinishLaunching에서 직접 탐색 컨트롤러를 제시하는 대신

- (void)initializeAndPresentNavigationController { 
    UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:firstRun]; 
    [[self tabBarController] presentModalViewController:navCtrl animated:NO]; 
} 
  • 전화 :

    1. 는 네비게이션 컨트롤러를 인스턴스화하는 방법을 만들

      [self performSelector:@selector(initializeAndPresentNavigationController) withObject:nil afterDelay:0.0]; 
      

    여기서 메소드 a를 호출하는 트릭 2에서 할 수있는 것은 initializeAndPresentNavigationController에 대한 호출이 단순히 메인 루프에 푸시되고 앱이 초기 UI를 작성할 가능성이있는 후에 실행된다는 것입니다.

    희망은 당신을 위해 작동합니다.

  • +0

    안녕 세르지오! 당신의 도움을 주셔서 감사합니다. 그러나이 해결책은 효과가 없었습니다. 컨트롤러에 대한 동일한 오류 ** displayedViewController가 발생합니다 : ** –

    관련 문제