내 앱에서 탐색 컨트롤러를 사용하고 있습니다. 나중에 일부보기 presentViewController
에서 확대 된 이미지를 보여주기 위해 사용 하고 있습니다. 또한 스토리 보드 또는 펜촉을 사용하지 않습니다.
iOS 7에서만이 오류가 발생합니다. iOS 6 및 이전 버전에서 잘 작동합니다.
분리 된 뷰 컨트롤러에 뷰 컨트롤러를 표시하지 않는 것이 좋습니다.
내 앱에서 탐색 컨트롤러를 사용하고 있습니다. 나중에 일부보기 presentViewController
에서 확대 된 이미지를 보여주기 위해 사용 하고 있습니다. 또한 스토리 보드 또는 펜촉을 사용하지 않습니다.
iOS 7에서만이 오류가 발생합니다. iOS 6 및 이전 버전에서 잘 작동합니다.
분리 된 뷰 컨트롤러에 뷰 컨트롤러를 표시하지 않는 것이 좋습니다.
답변:
푸시 탐색에서 경고가 표시되지 않도록하려면 다음을 직접 사용할 수 있습니다.
[self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil];
그런 다음 모달보기 컨트롤러에서 모든 것이 끝나면 다음을 호출하면됩니다.
[self dismissViewControllerAnimated:YES completion:nil];
self.navigationController
나를 위해 사용 했습니다.
이 경고의 이유는 전체 크기가 아닌 작은보기에보기 컨트롤러를 표시했기 때문입니다. 아래는 내 프로젝트의 이미지입니다. 위의 네 가지 옵션을 클릭하십시오. 사용자는 다른 childviewcontroller의보기로 이동합니다 (tabViewcontroller처럼 작동합니다). 그러나 childviewcontroller에는 작은 크기의보기가 포함되어 있습니다. 따라서 childviewcontroller에서보기를 제시하면이 경고가 나타납니다.
이것을 피하기 위해 childviewcontroller의 부모에 대한 견해를 제시 할 수 있습니다
[self.parentViewController presentViewController:viewController animated:YES completion:nil];
기다립니다 viewDidAppear()
:
이 오류는보기가 실제로 나타나기 전에보기 제어기를 표시하려고하는 경우에도 발생할 수 있습니다 (예 :보기를 viewWillAppear()
이전 또는 이전에 표시). 그 이후 viewDidAppear()
또는 내부에 다른 견해를 제시 하십시오.
viewDidLoad()
사람들에게 뷰 컨트롤러를 표시하지 마십시오 . 나는이 실수를 너무나 많이했다.
내 경우에는 sampleViewController
의보기를 하위보기로 추가 한 다음 sampleViewController
( 보기 self
대신 UIViewController
인스턴스) 보기에서 팝 오버를 제시하려고합니다 .
[self.view addSubview:sampleViewController.view];
올바른 방법은 다음과 같습니다.
// make sure the vc has been added as a child view controller as well
[self addChildViewController:sampleViewController];
[self.view addSubview:sampleViewController.view];
[sampleViewController didMoveToParentViewController:self];
Btw, 이것은 테이블 뷰 셀에서 팝 오버를 나타내는 경우에도 작동합니다. 테이블 뷰 컨트롤러가 하위 뷰 컨트롤러로 추가되었는지 확인하면됩니다.
[self addChildViewController:sampleViewController];
. 이제 추가했습니다. 감사합니다
문제는 적절한 뷰 컨트롤러 계층 구조가 없다는 것입니다. 앱의 rootviewcontroller를 설정 한 다음 새보기 컨트롤러를 밀어 올리거나 표시하여 새보기를 표시하십시오. 각 뷰 컨트롤러가 뷰를 관리하도록합니다. tabbarviewcontroller와 같은 컨테이너 뷰 컨트롤러 만 다른 뷰 컨트롤러 뷰를 자체 뷰에 추가해야합니다. 뷰 컨트롤러를 올바르게 사용하는 방법에 대한 자세한 내용은 뷰 컨트롤러 프로그래밍 안내서를 읽으십시오.https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/
나는 거의 같은 문제가 있습니다. 그 이유는 다른 컨트롤러에 "일부"컨트롤러를 표시하려고했기 때문에 애니메이션이 완료된 후 컨트롤러를 루트로 설정했습니다. 이 작업이 끝나면 모든 추가 컨트롤러가 경고 메시지를 표시합니다. " 분리 된 뷰 컨트롤러에 뷰 컨트롤러를 표시하지 않는 것이 좋습니다. ". 그리고이 경고를 시작 부분에 프리젠 테이션없이 "일부"컨트롤러를 루트로 설정하면됩니다.
제거 :
[[self rootController] presentViewController:controller animated:YES completion:^{
[self window].rootViewController = controller;
[[self window] makeKeyAndVisible];}];
프레젠테이션없이 루트로 만드십시오.
[[self window] setRootViewController:controller];
TabBarController
그것이 TabBarController
기본 응용 프로그램 인지에 대해 제시하십시오 .
[self.tabBarController presentViewController:viewController animated:YES completion:nil];
이유 self
는 자녀의 자녀 일 수 있으며 TabBarController
에서 발표하려고합니다 ChildViewController
.
예, 다른 뷰에있는 경고 컨트롤러를 표시하면서 동일한 경고 메시지에 직면했습니다. 나중에 다음과 같이 부모보기 컨트롤러에서 경고 컨트롤러를 제시하여 이것을 피했습니다.
[self.parentViewController presentViewController:alertController animated:YES completion:nil];
새 컨트롤러를 상위 뷰 컨트롤러의 자식으로 표시 할 뷰 컨트롤러를 추가해야합니다.
MainViewController가 있고 controllerA라는 새 컨트롤러를 추가 한 다음 controllerA에서 controllerB라는 새 컨트롤러를 제시하려고한다고 가정하겠습니다.
다음과 같이 작성해야합니다.
[self addChildViewController:controllerA]; //self is yourMainViewController
[self.view addsubView:controllerA.view];
그리고 controllerA 내에서 경고없이 새 컨트롤러를 제시 할 수 있습니다
[self presentViewController:controllerB animated:YES completion:nil]; //self is controllerA
Swift 4.1 및 Xcode 9.4.1에서
해결책은
DispatchQueue.main.async(execute: {
self.present(alert, animated: true)
})
이렇게 쓰면 같은 오류가 발생합니다.
let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
})
alert.addAction(defaultAction)
present(alert, animated: true, completion: nil)
같은 오류가 발생합니다
Presenting view controllers on detached view controllers is discouraged <MyAppName.ViewController: 0x7fa95560Z070>.
완벽한 솔루션은
let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .default, handler: { action in
})
alert.addAction(defaultAction)
//Made Changes here
DispatchQueue.main.async(execute: {
self.present(alert, animated: true)
})
사용자 정의 탐색 막대가있는이 스레드에 도달했으며이를 통해 AlertViewController를 호출했습니다.
메인 뷰 컨트롤러에 자식으로 추가해야했습니다. 그런 다음 경고없이 present라고 부를 수 있습니다.
당신은 추가해야합니다 Zoomed Image View Controller
메인 ViewController의 자식으로 .
(예)
[self addChildViewController:ZoomedImageViewController];
그런 다음 ZoomedImageViewController를 호출 할 수 있습니다
[self presentViewController:ZoomedImageViewController];
많은 답변이 옳습니다.
이 문제는 동료가 AViewController를 BViewController에 추가 할 때 발생했습니다. 어쨌든 그는 AViewController의 뷰를 BViewController의 뷰에 추가합니다.
add bViewController.addChild (aViewController)에 의해 수정되었습니다.
UIViewController 종류의 어디에서나 경고 또는 유사한 것을 표시 하려는지 여부에 따라 다릅니다.
이 코드 예제를 사용할 수 있습니다.
UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Example" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:nil];
[alert addAction:cancelAction];
[[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:alert animated:true completion:nil];
Attempt to present <UIAlertController: 0x7fc01a1eb600> on <ViewController: 0x7fc019821e00> whose view is not in the window hierarchy!