"Ожидается, что окна приложений будут иметь корневой контроллер представления в конце запуска приложения" ошибка при запуске проекта с 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?
10 ответов:
из Вашего сообщения об ошибке:
ожидается, что окна приложений будут иметь корневой контроллер представления в конце запуска приложения
сколько лет этому" старому " проекту? Если это больше, чем несколько лет, у вас все еще есть:
[window addSubview:viewController.view];вместо этого вы должны заменить его:
[window setRootViewController:viewController];
Если вы уже установили 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 требует, чтобы все окна должны иметь 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 в navigationController, который является вашим UIViewController в приложении-делегате.rb как мой код ниже. Я новичок в Ruby, но надеюсь, что это помогло...
rootViewController = UIViewController.alloc.init @window.rootViewController = navigationController
Я пришел в эту проблему с приложением я более или менее по наследству. После проверки того, что раскадровка была правильно настроена в качестве основного интерфейса приложений и что раскадровка имела 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 Исправлена ошибка.
У меня есть старый проект, который работал в iOS 8, но не iOS 9. Если ваш основной интерфейс установлен в MainWindow.xib, обновите его до раскадровки. Это исправило его для меня:
Swift 2 решение, которое сработало для меня:
вставьте код ниже в AppDelegate - > didFinishLaunchingWithOptions
self.window!.rootViewController = storyboard.instantiateViewControllerWithIdentifier("YourRootViewController") as? YourRootViewControllerClass

Comments