"При запуске проекта с 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?

Ответ 1

Из вашего сообщения об ошибке:

В окнах приложений ожидается, что в конце запуска приложения будет установлен корневой контроллер.

Сколько лет этот "старый" проект? Если это более чем на несколько лет, у вас все еще есть:

[window addSubview:viewController.view];

Вместо этого вы должны заменить его:

[window setRootViewController:viewController];

Ответ 2

Если вы уже установили rootViewController вашего self.window в своем делете приложения и все еще получаете эту ошибку во время выполнения, то, вероятно, у вас, вероятно, более одного окна в вашем 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;
    }
}

Обновление. По-видимому, есть окно, посвященное строке состояния, которая обычно вызывает эту проблему. Приведенный выше код должен исправить эту ошибку.

Ответ 3

XCODE 7 требует, чтобы все Windows должны иметь rootViewController Вы можете легко использовать:

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

Он работает хорошо, если вам нужно использовать только UIWindow (для простых примеров из любых учебников - до Xcode 7)!

Ответ 4

Похоже, что с iOS 9.1 (?) или Xcode 7.1 любой UIWindow, созданный в течение application(_:didFinishLaunchingWithOptions:) перед тем, как оставить этот метод, должен быть установлен rootViewController.

Раньше этого было достаточно, чтобы только главное окно располагало rootViewController во время этого метода. Теперь любой экземпляр UIWindow должен иметь действительное свойство rootViewController.

В этом случае виновником может быть ваш собственный код, если вы используете UIWindow, а также любую другую стороннюю библиотеку, которая пытается инициализировать новый экземпляр UIWindow в течение этого времени (например, наложения на панели состояния и т.д.).

ПРИМЕЧАНИЕ. Вы также получите ту же ошибку, если не задаете rootViewControler в своем главном окне или если раскадровка не настроена правильно. Упоминание об этом как побочном примечании, поскольку эти случаи довольно очевидны и понятны.

Ответ 5

Вы должны установить каждое свойство rootviewcontroller окна в своем приложении

Ответ 6

Это тоже укусило меня сегодня, и это стоило мне нескольких часов, чтобы исправить это: у моего приложения есть окно в "MainWindow.xib", в комплекте с навигационным контроллером и сопровождающим контроллером корневого представления, которые были автоматически созданы в правильный порядок, с Xcode 6 и iOS8.

В iOS9 приложение все еще отлично работает при загрузке из AppStore, но не при его создании с помощью Xcode 7 и запускается на iOS 9. В то время, когда делегат приложения выполняет свой метод applicationDidBecomeActive: теперь контроллер корневого представления теперь не загружен, как это было раньше! Это заставило контроллер корневого представления пропустить вызов моего кода состояния восстановления.

Я исправил это, создав экземпляр контроллера корневого представления самостоятельно, в коде и восстановив его состояние из viewDidLoad, явно.

Ответ 7

Просто установите rootViewController на navigationController, который является вашим UIViewController в app-delegate.rb, как мой код ниже. Я новичок в рубине, но надеюсь, что это помогло...

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController

Ответ 8

Я пришел к этой проблеме с приложением, которое я больше не унаследовал. После проверки того, что раскадровка была правильно настроена как основной интерфейс приложений, и что в раскадровке был 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 исправило ошибку.

Ответ 9

У меня есть более старый проект, работающий в iOS 8, но не iOS 9. Если ваш основной интерфейс установлен на MainWindow.xib, обновите его до раскадровки. Это исправило это для меня:

  • Создайте новый проект, приложение Single View отлично.
  • Скопируйте файл Main.storyboard в свой проект или просто создайте свой собственный.
  • Откройте ваши настройки проекта и установите основной интерфейс на Main.storyboard Установите основной интерфейс на главную .storyboard

Ответ 10

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

Вставьте код ниже в AppDelegate → didFinishLaunchingWithOptions

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