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