"Ожидается, что окна приложений будут иметь корневой контроллер представления в конце запуска приложения" ошибка при запуске проекта с 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?

556   10  

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 каждого окна в вашем приложении

просто установите 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, обновите его до раскадровки. Это исправило его для меня:

  1. создать новый проект, Один вид приложения в порядке.
  2. скопировать основной.раскадровка файл для вашего проекта, или вы можете просто создать свой собственный.
  3. Откройте настройки проекта и установите основной интерфейс в Main.раскадровка Set your Main Interface to Main.storyboard

Swift 2 решение, которое сработало для меня:

вставьте код ниже в AppDelegate - > didFinishLaunchingWithOptions

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

Comments

    Ничего не найдено.