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


89

기능 실행 후

- (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로 빌드하고 실행하려면 어떻게해야합니까?


Xcode 7은 베타 버전이므로 심각한 개발 작업을 위해서는 Xcode 6으로 돌아 가야합니다.
Paul R


안녕하세요 나는이 eroor를 얻고 있습니다 :-***-[UIApplication _runWithMainScene : transitionContext : completion :], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m : 3294이 문제를 해결하는 방법
아카 쉬 Raghani

답변:


175

오류 메시지에서 :

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

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

[window addSubview:viewController.view];

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

[window setRootViewController:viewController];

1
나는 같은 문제가 있으며 iOS 9 문제라고 생각합니다. 내 프로젝트는 iOS 7 및 8에서 작동합니다. 어떤 이유로 스토리 보드의보기가 올바르게 설정되지 않았습니다.
데이비드 Snabel-Caunt

3
대단히 감사합니다. 대답은 오류 메시지에 "응용 프로그램 창은"나는 내 프로젝트에서 두 개의 윈도우가 발견 한 정상 widdow이고, 다른 하나는라는 타사 modual이다
앤드류 왕

3
MTStatusBarOverlay 및 RootViewController가 없으며 iOS9에는 모든 창에 rootViewController가 있어야합니다.
앤드류 왕

1
예, 결국 동일한 문제를 발견했습니다. 내 앱에는 루트 뷰 컨트롤러가없는 추가 창이 있습니다.
데이비드 Snabel-Caunt

1
나를 위해 일하는 솔루션을 찾았습니다. stackoverflow.com/a/32719949/1881895
barrast

37

앱 델리게이트에서 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;
    }
}

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


2
감사!! 이것은 저에게 문제가되었습니다. 메인 뷰 컨트롤러를 설정했지만 앱에는 제가 알지 못하는 두 번째 창이 있습니다.
n13 2015 년

너무 견고합니다 ... 나는 신인이 아니며 iOS 9.1을 실행하는 Xcode 7.1로 업데이트 할 때 나를 얻었습니다 ... 상태 표시 줄에는 전용 창이 있습니다 ... 물론 그렇습니까?! 누군가에게 의미가 있다면 상태 표시 줄을 숨기고 있습니다.
whyoz 2005

와우, 내 앱 12 개 중 2 개가 앱 검토를 위해 충돌했는데이 문제가 해결 된 것 같습니다.
Andrew Smith

잘 했어 !! "분명히이 문제를 일으키는 상태 표시 줄 전용 창이있는 것 같습니다."
eGanges

1
이 메서드는 rootViewController에서 viewDidLoad 및 viewWillAppear가 두 번 호출 될 수 있습니다. 수동 초기화 창이있는 경우 plist를 확인하고이 해결 방법을 사용한 후 두 번 호출 된 항목이 표시되는 경우 Window.xib가 "Main nib file base name"으로 정의되지 않았는지 확인하십시오. 그런 다음 평소처럼이 코드와 setRootViewController를 제거하면됩니다.
whyoz

21

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

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

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


Stack Overflow에 오신 것을 환영합니다! 코드가 수행하는 작업과 문제를 해결하는 이유에 대한 설명을 추가하려면 게시물을 편집하는 것이 좋습니다. 대부분 코드 만 포함하는 답변 (작동 중이더라도)은 일반적으로 OP가 문제를 이해하는 데 도움이되지 않습니다.
SuperBiasedMan 2015 년

감사합니다. iOS ~ 3–8 경고 => iOS 9 충돌을 피했지만 누출에 대한 정적 분석기 경고를 제공했습니다. 그래서 저는 applicationDidFinishLaunching의 할당과 함께 헤더의 인터페이스로 선언을 옮겼습니다. 그런 다음 [vc release]를 dealloc에 ​​추가했습니다.
Flash Sheridan

13

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

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

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

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


당신은 훌륭합니다 : D, 고마워요 난 그냥 창 초기화에 대해 언급하고 이제 모든 것이 괜찮습니다
mohammad alabid

3

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

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

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


2

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


당신의 대답은 나에게 도움이
Aznix

2

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

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

1

아래 코드와 같이 app-delegate.rb의 UIViewController 인 navigationController로 rootViewController를 설정하십시오. 나는 루비를 처음 접했지만 이것이 도움이되기를 바랍니다.

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController

1

나는 내가 상속받은 앱 으로이 문제를 겪었습니다. 스토리 보드가 앱 기본 인터페이스로 올바르게 설정되었고 스토리 보드에 RootViewController가 있는지 확인한 후에도 여전히 충돌이 발생했습니다.

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Application windows are expected to have a root view controller at the end of application launch'

에서 호출되는 일부 뷰 논리 (SVProgressHud)로 인해 충돌이 발생했다는 추가 조사 후 발견 한 내용입니다 - (void)applicationDidBecomeActive:(UIApplication *)application. 이것은 Xcode7의 새로운 동작으로 보이지만 SVProgressHud가 스토리 보드에 의해 설정되기 전에 rootviewcontroller를 참조하고 있다고 말할 수 있습니다. 궁극적으로 SVProgressHud를 2.0으로 업데이트하면 버그가 수정되었습니다.


0

나를 위해 일한 Swift 2 솔루션 :

AppDelegate-> didFinishLaunchingWithOptions에 아래 코드를 삽입하십시오.

self.window!.rootViewController = storyboard.instantiateViewControllerWithIdentifier("YourRootViewController") as? YourRootViewControllerClass

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