"애플리케이션이 활성 컨트롤러를 모달로 제시하려고했습니다"?


100

방금 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 설치가 없지만 거의 완전히 그렇지 않습니다.

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


iOS 5 이전에는 예외가 발생하지 않았지만 아무것도 반환하지 않았습니다. iOS 5부터이 명령은 예외를 발생시킵니다.
Frédéric Adda

답변:


103

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

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 요소를 특정 방식으로 취급하기를 기대합니다. 이것은 아마도 휴먼 인터페이스 가이드 라인 어딘가에 "우리는 당신이 이것을하기를 원하지 않기 때문에 이것을하지 마십시오"라고 묻혀있을 것입니다.


6
문제는 이것이 iOS 5 이전에는 전혀 문제가되지 않았기 때문에 제 걱정입니다! 내가 한 일은 탭 바에 더미 UIViewController를 추가하고 실제 뷰 컨트롤러 하위 클래스 인스턴스를 모달로 제시하는 것입니다.
Javier Soto

1
애니메이션 : 완료 및 앱 변경 처리하는 방법을 확인 @Iswank, 이제 아이폰 OS 6, 일을하기 위해 "쉽게,"그들이 presentModalViewController가 회전 모든 종류의 문제가 발생되지 않는 ... 당신은 presentViewController를 사용할 필요가
whyoz

15

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

[self dismissModalViewControllerAnimated:YES];

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


모달 뷰 컨트롤러를 다시 표시하려고 할 때까지 여전히 모달 방식으로 화면에 표시되고 애니메이션으로 표시되므로 애니메이션을 해제하면 실패합니다.
Pascal

2
IOS 6.0
Sumit Kumar Saha

12

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

viewController.isBeingPresented

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

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


viewWillappperar에서만 작동하지만 이미 제시된 viewController를 제시하기 전에 확인하면 항상 false를 반환합니다.
전문가

1
나를 위해 일하지 않습니다. 여전히 앱 충돌이 발생합니다. (! viewController.presentingViewController) 문제가 해결되었습니다.
Argus

3

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

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

2

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


0

그냥 제거

[tabBarController presentModalViewController:viewController animated:YES];

그리고 유지

[self dismissModalViewControllerAnimated:YES];

이것은 더 이상 사용되지 않는 경고를 제공합니다 ... 그래서 이것의 대안은 무엇입니까?
Kirtikumar A. 2013

여기에서는 [blockSelf dismissViewControllerAnimated : YES 완료 : nil]을 사용했습니다.
Kirtikumar A. 2013

0

사용하는 대신:

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

당신이 사용할 수있는:

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

0

내 경우에는, 내가 제시 한 rootViewController의를 UINavigationControllerI가를 제시했는데 때 UINavigationController자신을.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.