it-source

경고:-분리된 뷰 컨트롤러에는 뷰 컨트롤러를 표시하지 마십시오.

criticalcode 2023. 6. 6. 00:01
반응형

경고:-분리된 뷰 컨트롤러에는 뷰 컨트롤러를 표시하지 마십시오.

내 앱에서, 나는 내비게이션 컨트롤러를 사용하고 있습니다.는 나에내사일보기부는하용을 사용하고 .presentViewController확대/축소된 이미지를 표시합니다.또한 스토리보드나 닙을 사용하지 않습니다.

iOS 7에서만 이 오류가 발생합니다.iOS 6 및 이전 버전에서 잘 작동합니다.

뷰 컨트롤러를 분리된 뷰 컨트롤러에 표시하는 것은 권장되지 않습니다.

푸시 탐색에서 경고가 표시되지 않도록 하려면 다음을 직접 사용할 수 있습니다.

[self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil];

그런 다음 모달 뷰 컨트롤러에서 모든 작업이 완료되면 다음과 같이 전화할 수 있습니다.

[self dismissViewControllerAnimated:YES completion:nil];

를 기다리다viewDidAppear():

에 뷰 이할 수 . 를 들어, 하는 경우에는 " " " " " " " ( " " " " " " " " " " " " " 에서 뷰를 표시합니다.viewWillAppear()그 이전에.다음 후에 다른 보기를 표시합니다.viewDidAppear()또는 그 안에.

이 경고의 이유는 전체 크기 뷰가 아닌 작은 뷰에 뷰 컨트롤러를 표시하고 있었기 때문입니다.아래는 제 프로젝트의 이미지입니다.위의 네 가지 옵션을 클릭합니다.사용자가 다른 하위 보기 컨트롤러의 보기로 이동합니다.(tabView 컨트롤러와 같이 작동합니다.)그러나 하위 보기 컨트롤러에는 작은 크기의 보기가 포함되어 있습니다.따라서 하위 보기 컨트롤러에서 보기를 표시하면 이 경고가 표시됩니다.

마스터 상세 뷰

이를 방지하기 위해 하위 보기 컨트롤러의 상위 보기를 표시할 수 있습니다.

  [self.parentViewController presentViewController:viewController animated:YES completion:nil];

저 같은 경우에는.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];

B.t.w., 이것은 테이블 뷰 셀에서 팝업을 표시하는 경우에도 작동합니다. 테이블 뷰 컨트롤러가 하위 뷰 컨트롤러로 추가되었는지 확인하기만 하면 됩니다.

스위프트 3

이것에 걸려 넘어지는 사람을 위해, 여기 빠른 답이 있습니다.

self.parent?.present(viewController, animated: true, completion: nil)

보기 컨트롤러 계층이 제대로 되어 있지 않은 것이 문제라고 생각합니다.앱의 루트 뷰 컨트롤러를 설정한 다음 새 뷰 컨트롤러를 누르거나 표시하여 새 뷰를 표시합니다.각 보기 컨트롤러가 보기를 관리하도록 합니다.탭바 뷰 컨트롤러와 같은 컨테이너 뷰 컨트롤러만 다른 뷰 컨트롤러 뷰를 자신의 뷰에 추가해야 합니다.뷰 컨트롤러를 올바르게 사용하는 방법에 대한 자세한 내용은 뷰 컨트롤러 프로그래밍 가이드를 참조하십시오.https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/

저도 거의 같은 문제를 안고 있습니다.그 이유는 "some" 컨트롤러를 다른 컨트롤러에 표시하려고 했고 애니메이션이 완료된 후 표시 컨트롤러를 루트로 설정했기 때문입니다.이 작업이 끝나면 표시되는 모든 컨트롤러에서 "분리된 컨트롤러에 컨트롤러를 표시하는 것은 권장되지 않습니다."라는 경고가 표시됩니다.이 경고를 해결하려면 처음에 프레젠테이션 없이 "일부" 컨트롤러를 루트로 설정해야 합니다.

제거됨:

[[self rootController] presentViewController:controller animated:YES completion:^{

       [self window].rootViewController = controller;

       [[self window] makeKeyAndVisible];}];

프레젠테이션 없이 루트로 만들기만 하면 됩니다.

 [[self window] setRootViewController:controller];

이에 대한 해결책 중 하나는 자녀 뷰 컨트롤러가 있는 경우입니다. 따라서 주어진 대로 부모 뷰 컨트롤러를 표시하면 됩니다.

[self.parentViewController presentViewController:viewController animated:YES completion:nil];

또한 해제에는 동일한 해제 뷰 컨트롤러를 사용합니다.

[self dismissViewControllerAnimated:YES completion:nil];

이것은 저에게 완벽한 해결책입니다.

사용하다[self.navigationController presentViewController:xxx animated:YES completion:nil] 8i에서OS 8에서.

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)
})

이 코드를 사용해 보십시오.

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:<your ViewController object>];

[self.view.window.rootViewController presentViewController:navigationController animated:YES completion:nil];

프레젠테이션을 시도해보기TabBarController 그것이 다면렇라면.TabBarController 앱. 기반앱

[self.tabBarController presentViewController:viewController animated:YES completion:nil];

는 이는일 수 .self의 입니다.TabBarController그리고 당신은 발표하려고 노력하고 있습니다.ChildViewController.

예, 다른 보기에 있는 Alert 컨트롤러를 표시하는 동안에도 동일한 경고 메시지가 표시되었습니다.나중에 아래와 같이 상위 뷰 컨트롤러의 경고 컨트롤러를 표시하여 이러한 문제를 방지했습니다.

[self.parentViewController presentViewController:alertController animated:YES completion:nil];

새 컨트롤러를 상위 뷰 컨트롤러의 하위로 표시할 뷰 컨트롤러를 추가해야 합니다.

MainView 컨트롤러가 있다고 가정하고 컨트롤러 A라는 새 컨트롤러를 추가한 다음 컨트롤러에서 컨트롤러 B라는 새 컨트롤러를 제공하려고 합니다.a

당신은 다음과 같은 것을 써야 합니다.

[self addChildViewController:controllerA]; //self is yourMainViewController
[self.view addsubView:controllerA.view]; 

그리고 컨트롤러 A 내에서 경고 없이 새 컨트롤러를 제시할 수 있습니다.

[self presentViewController:controllerB animated:YES completion:nil]; //self is controllerA

사용자 지정 탐색 모음이 있는 이 스레드에 도달하여 이 스레드를 통해 AlertView 컨트롤러를 호출했습니다.

어렸을 때 메인 뷰 컨트롤러에 추가해야 했습니다.그러면 아무 예고 없이 전화해서 제시할 수 있습니다.

다음 항목을 추가해야 합니다.Zoomed Image View Controller기본 View Controller의 하위 항목입니다.

(예:)

[self addChildViewController:ZoomedImageViewController];

그러면 확대된 이미지 보기 컨트롤러를 호출할 수 있습니다.

[self presentViewController:ZoomedImageViewController];

시작할 루트 뷰 컨트롤러가 있는지 확인합니다. 있습다니에서 할 수 .didFinishLaunchingWithOptions.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    [window setRootViewController:viewController];
}

이 경고에 대한 많은 이유.View 컨트롤러에서 모듈식으로 표시될 다른 컨트롤러로 연결된 세그가 있기 때문입니다.그러나 제가 제시하는 ViewController는 PageViewController에 의해 동적으로 생성되고 있습니다.이것이 스토리보드에서 분리된 이유입니다.내 앱은 그것 때문에 작동하지 않을 것입니다. 하지만 경고를 잠재우고 싶습니다.

경고를 표시할 것인지 또는 유사한 UIView 컨트롤러를 표시할 것인지에 따라 다릅니다.

다음 코드 예제를 사용할 수 있습니다.

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];

많은 답들이 맞습니다.

  • 현재 ViewController에 parentViewController가 있는지 확인합니다.
  • 아니오인 경우 추가해야 할 위치에 추가
  • 그렇지 않으면 모든 뷰 컨트롤러에 부모가 있을 때까지 재귀적으로 parentViewController에 parentViewController가 있는지 확인합니다.

이 문제는 동료가 BViewController에 ViewController를 추가할 때 발생했습니다.어떻게든, 그는 AviewController의 뷰를 BViewController의 뷰에 추가하기만 하면 됩니다.

add bViewController.addChild(aViewController)로 수정됨

언급URL : https://stackoverflow.com/questions/19890761/warning-presenting-view-controllers-on-detached-view-controllers-is-discourage

반응형