기능 실행 후
- (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
속성 이 있어야 합니다.
이 시간 동안 UIWindow
새 UIWindow
인스턴스 를 초기화하려고하는 다른 타사 라이브러리 (예 : 상태 표시 줄 메시지 오버레이 등)를 사용하는 경우 여기에서 사용자 고유의 코드가 원인 일 수 있습니다 .
참고 : rootViewControler
메인 창에서을 설정하지 않았거나 스토리 보드가 올바르게 설정 되지 않은 경우에도 동일한 오류가 발생합니다 . 이러한 경우는 매우 명확하고 수정하기가 쉽기 때문에이를 부수적으로 언급합니다.
답변
이로 인해 오늘도 저를 물었고 고치는 데 몇 시간이 걸렸습니다. 내 앱에는 탐색 컨트롤러와 함께 제공되는 루트 뷰 컨트롤러가 포함 된 “MainWindow.xib”에 창이 있으며, 모두 적절한 순서로 자동 인스턴스화되었습니다. , Xcode 6 및 iOS8.
iOS9에서는 AppStore에서 다운로드 할 때 앱이 여전히 잘 실행되지만 Xcode 7로 새로 빌드되고 iOS 9에서 실행되는 경우에는 실행 되지 않습니다 . 앱 델리게이트가 해당 applicationDidBecomeActive : 메서드를 실행할 때 루트 뷰 컨트롤러는 이제 로드 되지 않습니다. 이전에 사용되었습니다! 이로 인해 루트 뷰 컨트롤러가 내 복원 상태 코드에 대한 호출을 놓쳤습니다.
코드에서 루트 뷰 컨트롤러를 직접 인스턴스화하고 viewDidLoad에서 상태를 명시 적으로 복원하여이 문제를 해결했습니다.
답변
앱에서 모든 창의 rootviewcontroller 속성을 설정해야합니다.