[xcode7] Xcode 7, iOS 9로 프로젝트를 실행할 때 “애플리케이션 창에 애플리케이션 실행 종료시 루트 뷰 컨트롤러가있을 것으로 예상됩니다.”오류

기능 실행 후

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

충돌이 있습니다.

 Assertion failure in
-[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-

 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', `enter code here`reason: 'Application windows are expected to have a root view controller at the end of application launch'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000109377885 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x0000000108df0df1 objc_exception_throw + 48
    2   CoreFoundation                      0x00000001093776ea +[NSException raise:format:arguments:] + 106
    3   Foundation                          0x0000000108a42bb1 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198
    4   UIKit                               0x000000010760e350 -[UIApplication _runWithMainScene:transitionContext:completion:] + 2875
    5   UIKit                               0x000000010760b73f -[UIApplication workspaceDidEndTransaction:] + 188
    6   FrontBoardServices                  0x000000010b87fd7b FrontBoardServices + 163195
    7   FrontBoardServices                  0x000000010b880118 FrontBoardServices + 164120
    8   CoreFoundation                      0x00000001092a20f1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    9   CoreFoundation                      0x0000000109297eac __CFRunLoopDoSources0 + 556
    10  CoreFoundation                      0x0000000109297363 __CFRunLoopRun + 867
    11  CoreFoundation                      0x0000000109296d78 CFRunLoopRunSpecific + 488
    12  UIKit                               0x000000010760b091 -[UIApplication _run] + 402
    13  UIKit                               0x000000010760f79b UIApplicationMain + 171
    14  bbwc                                0x00000001037a9998 main + 344
    15  libdyld.dylib                       0x000000010a45ca05 libdyld.dylib + 10757
    16  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

이 프로젝트는 오래된 프로젝트입니다. Xcode 7 및 iOS 9로 빌드하고 실행하려면 어떻게해야합니까?



답변

오류 메시지에서 :

응용 프로그램 시작이 끝날 때 응용 프로그램 창에 루트 뷰 컨트롤러가있을 것으로 예상됩니다.

이 “오래된”프로젝트는 몇 살입니까? 몇 년이 지난 경우에도 다음과 같은 사항이 있습니까?

[window addSubview:viewController.view];

대신 다음으로 대체해야합니다.

[window setRootViewController:viewController];


답변

앱 델리게이트에서 self.window의 rootViewController를 이미 설정했는데 런타임에이 오류가 계속 발생하는 경우 UIApplication에 둘 이상의 창이 있고 그중 하나에는 rootViewController가 연결되어 있지 않을 수 있습니다. 앱 창을 반복하고 빈 viewController를 rootViewController에 연결하여 오류를 수정할 수 있습니다.

다음은 앱 창을 반복하고 창이없는 경우 빈 ViewController를 rootViewController에 연결하는 코드입니다.

NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow *window in windows) {
    NSLog(@"window: %@",window.description);
    if(window.rootViewController == nil){
        UIViewController* vc = [[UIViewController alloc]initWithNibName:nil bundle:nil];
        window.rootViewController = vc;
    }
}

업데이트 : 일반적으로이 문제를 일으키는 상태 표시 줄 전용 창이 있습니다. 위의 코드는이 오류를 수정해야합니다.


답변

XCODE 7에서는 모든 Windows에 rootViewController가 있어야합니다. 쉽게 사용할 수 있습니다.

UIViewController* vc = [[UIViewController alloc]initWithNibName:nil bundle:nil];
self.window.rootViewController = vc;

UIWindow 만 사용해야한다면 잘 작동합니다 (Xcode 7 이전의 튜토리얼의 쉬운 예)!


답변

iOS 9.1 (?) 또는 Xcode 7.1 이후로 UIWindow인스턴스화 된
모든 메서드는 해당 메서드를 떠나기 전에 집합 application(_:didFinishLaunchingWithOptions:)이 있어야합니다 rootViewController.

이전에는 rootViewController해당 메서드 동안 주 창에만 세트 가 있으면 충분했습니다 . 이제 모든 UIWindow인스턴스에는 유효한 rootViewController속성 이 있어야 합니다.

이 시간 동안 UIWindowUIWindow인스턴스 를 초기화하려고하는 다른 타사 라이브러리 (예 : 상태 표시 줄 메시지 오버레이 등)를 사용하는 경우 여기에서 사용자 고유의 코드가 원인 일 수 있습니다 .

참고 : rootViewControler메인 창에서을 설정하지 않았거나 스토리 보드가 올바르게 설정 되지 않은 경우에도 동일한 오류가 발생합니다 . 이러한 경우는 매우 명확하고 수정하기가 쉽기 때문에이를 부수적으로 언급합니다.


답변

이로 인해 오늘도 저를 물었고 고치는 데 몇 시간이 걸렸습니다. 내 앱에는 탐색 컨트롤러와 함께 제공되는 루트 뷰 컨트롤러가 포함 된 “MainWindow.xib”에 창이 있으며, 모두 적절한 순서로 자동 인스턴스화되었습니다. , Xcode 6 및 iOS8.

iOS9에서는 AppStore에서 다운로드 할 때 앱이 여전히 잘 실행되지만 Xcode 7로 새로 빌드되고 iOS 9에서 실행되는 경우에는 실행 되지 않습니다 . 앱 델리게이트가 해당 applicationDidBecomeActive : 메서드를 실행할 때 루트 뷰 컨트롤러는 이제 로드 되지 않습니다. 이전에 사용되었습니다! 이로 인해 루트 뷰 컨트롤러가 내 복원 상태 코드에 대한 호출을 놓쳤습니다.

코드에서 루트 뷰 컨트롤러를 직접 인스턴스화하고 viewDidLoad에서 상태를 명시 적으로 복원하여이 문제를 해결했습니다.


답변

앱에서 모든 창의 rootviewcontroller 속성을 설정해야합니다.


답변

iOS 8에서는 작동했지만 iOS 9에서는 작동하지 않은 이전 프로젝트가 있습니다. Main Interface가 MainWindow.xib로 설정되어 있으면 스토리 보드로 업데이트하십시오. 이것은 나를 위해 수정했습니다.

  1. 새 프로젝트를 만듭니다. Single View Application은 괜찮습니다.
  2. Main.storyboard 파일을 프로젝트에 복사하거나 직접 만들 수 있습니다.
  3. 프로젝트 설정을 열고 메인 인터페이스를 Main.storyboard로 설정하십시오. 메인 인터페이스를 Main.storyboard로 설정하십시오.