[objective-c] “애플리케이션이 활성 컨트롤러를 모달로 제시하려고했습니다”?

방금 NSInvalidArgumentException전에이 작업을 수행하지 않았던 앱에서이 메시지와 함께 충돌 이 발생했습니다.

응용 프로그램이 활성 컨트롤러 UITabBarController : 0x83d7f00을 모달로 표시하려고했습니다.

나는이 UITabBarController난에서 작성한 AppDelegate및 그것을 배열을 줄을 UIViewControllers.

그중 하나를 탭하면 모달로 제시하고 싶습니다. 위임 메서드를 구현하여 수행했습니다.

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController

해당 뷰 컨트롤러가 모달로 표시하려는 클래스이면 NO를 반환하고

[tabBarController presentModalViewController:viewController animated:YES];

그리고 이제 그 오류가 발생합니다. 이는 다른 곳에서 활성화 된 뷰 컨트롤러를 모달로 표시 할 수 없음을 의미하는 것 같습니다 (탭바에서 …). XCode 4.2 Developer Preview 7에 있다고 말해야합니다. 이것은 iOS 5입니다 (NDA에 대해 알고 있지만 금지 된 세부 정보를 제공하지 않는 것 같습니다). 현재 iOS4 SDK에 대해 컴파일이 충돌하는지 테스트 할 XCode 설치가 없지만 거의 완전히 그렇지 않습니다.

이 문제를 경험 한 사람이 있는지 또는 제안 사항이 있는지 물어보고 싶었습니다.



답변

다음과 같이 인스턴스화 된 세 개의 뷰 컨트롤러가 있다고 가정합니다.

UIViewController* vc1 = [[UIViewController alloc] init];
UIViewController* vc2 = [[UIViewController alloc] init];
UIViewController* vc3 = [[UIViewController alloc] init];

다음과 같이 탭 표시 줄에 추가했습니다.

UITabBarController* tabBarController = [[UITabBarController alloc] init];
[tabBarController setViewControllers:[NSArray arrayWithObjects:vc1, vc2, vc3, nil]];

이제 다음과 같이하려고합니다.

[tabBarController presentModalViewController:vc3];

Tab Bar Controller에는 사용자가 지정한 뷰 컨트롤러에 대한 죽음 그립이 있기 때문에 오류가 발생합니다. 탭 표시 줄의 뷰 컨트롤러 배열에 추가 할 수 없거나 모달로 표시 할 수 없습니다.

Apple은 사용자가 UI 요소를 특정 방식으로 취급하기를 기대합니다. 이것은 아마도 휴먼 인터페이스 가이드 라인 어딘가에 “우리는 당신이 이것을하기를 원하지 않기 때문에 이것을하지 마십시오”라고 묻혀있을 것입니다.


답변

나도 같은 문제가있어. 해고 직후 뷰 컨트롤러를 제시하려고합니다.

[self dismissModalViewControllerAnimated:YES];

애니메이션없이 시도하면 완벽하게 작동하므로 문제는 컨트롤러가 여전히 살아 있다는 것입니다. 가장 좋은 해결책은 dismissViewControllerAnimated:completion:iOS5 에서 사용하는 것 같아요


답변

제 경우에는 다른 뷰 컨트롤러에서 viewController (TabBarViewController에 viewController의 참조가 있음)를 제시하려고 시도했지만 위의 메시지와 함께 충돌했습니다. 그 경우에는 제시를 피하고 사용하실 수 있습니다

viewController.isBeingPresented

!viewController.isBeingPresented {
          // Present your ViewController only if its not present to the user currently.
}

누군가를 도울 수 있습니다.


답변

나는 같은 문제가 있었다. 이 코드를 시도 할 수 있습니다.

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];


답변

부모 present대신 자식 뷰 컨트롤러를 시도했을 때 동일한 문제 오류가 발생했습니다.UINavigationViewController


답변

그냥 제거

[tabBarController presentModalViewController:viewController animated:YES];

그리고 유지

[self dismissModalViewControllerAnimated:YES];


답변

사용하는 대신:

self.present(viewControllerToPresent: UIViewController, animated: Bool, completion: (() -> Void)?)

당신이 사용할 수있는:

self.navigationController?.pushViewController(viewController: UIViewController, animated: Bool)