Po uruchomieniu funkcji
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
jest awaria:
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
Ten projekt jest starym projektem, co powinienem zrobić, aby skompilował się i działał z Xcode 7 i iOS 9?
Odpowiedzi:
Z komunikatu o błędzie:
Ile lat ma ten „stary” projekt? Jeśli minęło więcej niż kilka lat, czy nadal masz:
Zamiast tego powinieneś zamienić go na:
źródło
Jeśli ustawiłeś już rootViewController swojego self.window w delegacie aplikacji i nadal otrzymujesz ten błąd w czasie wykonywania, prawdopodobnie masz więcej niż jedno okno w swojej aplikacji UIApplication, z których jedno może nie mieć skojarzonego elementu rootViewController. Możesz zapętlić okna aplikacji i skojarzyć pusty element viewController z jego rootViewController, aby naprawić otrzymywany błąd.
Oto kod, który zapętla okna aplikacji i kojarzy pusty ViewController z rootViewController, jeśli w oknie go brakuje.
Aktualizacja: Najwyraźniej istnieje okno poświęcone paskowi stanu, które zwykle powoduje ten problem. Powyższy kod powinien naprawić ten błąd.
źródło
XCODE 7 wymaga, aby wszystkie systemy Windows miały rootViewController Możesz użyć łatwego:
Działa dobrze, jeśli musisz używać tylko UIWindow (dla łatwych przykładów z dowolnych samouczków - przed Xcode 7)!
źródło
Wygląda na to, że od iOS 9.1 (?) Lub Xcode 7.1 każda
UIWindow
instancja tworzona podczasapplication(_:didFinishLaunchingWithOptions:)
musi miećrootViewController
zestaw przed opuszczeniem tej metody.Wcześniej wystarczyło, aby tylko okno główne miało
rootViewController
zestaw podczas tej metody. Teraz każdaUIWindow
instancja musi mieć prawidłowąrootViewController
właściwość.Winowajcą może być tutaj twój własny kod, jeśli korzystasz z,
UIWindow
a także dowolnej innej biblioteki innej firmy, która próbuje zainicjować nowąUIWindow
instancję w tym czasie (np. Nakładki komunikatów paska stanu itp.).UWAGA : Ten sam błąd
rootViewControler
pojawia się również, jeśli nie ustawisz w głównym oknie lub jeśli scenorys nie jest poprawnie skonfigurowany. Wspominając o tym na marginesie, ponieważ te przypadki są dość oczywiste i łatwe do naprawienia.źródło
Ugryzło mnie to również dzisiaj i kosztowało mnie kilka godzin, aby to naprawić: moja aplikacja ma okno w pliku „MainWindow.xib”, wraz z kontrolerem nawigacji i towarzyszącym mu głównym kontrolerem widoku, które zostały automatycznie utworzone we właściwej kolejności , z Xcode 6 i iOS8.
W systemie iOS9 ta aplikacja nadal działa dobrze po pobraniu z AppStore, ale nie w przypadku nowej kompilacji z Xcode 7 i uruchomienia w systemie iOS 9. W czasie, gdy delegat aplikacji wykonuje swoją metodę applicationDidBecomeActive:, główny kontroler widoku nie jest teraz ładowany, ponieważ kiedyś! To sprawiło, że główny kontroler widoku przegapił wywołanie mojego kodu stanu przywracania.
Naprawiłem to, tworząc samodzielnie wystąpienie głównego kontrolera widoku w kodzie i jawnie przywracając jego stan z właściwości viewDidLoad.
źródło
W aplikacji należy ustawić właściwość rootviewcontroller każdego okna
źródło
Mam starszy projekt, który działał w systemie iOS 8, ale nie w iOS 9. Jeśli główny interfejs jest ustawiony na MainWindow.xib, zaktualizuj go do serii ujęć. To naprawiło to dla mnie:
źródło
Po prostu ustaw swój rootViewController na navigationController, który jest twoim UIViewController w app-delegate.rb, tak jak mój kod poniżej. Jestem nowy w Ruby, ale mam nadzieję, że to pomogło ...
źródło
Wpadłem na ten problem z aplikacją, którą bardziej lub mniej odziedziczyłem. Po sprawdzeniu, że storyboard został poprawnie skonfigurowany jako główny interfejs aplikacji i że scenorys miał RootViewController, nadal otrzymywałem awarię.
Co odkryłem po dalszych badaniach, że awaria była spowodowana wywołaniem jakiejś logiki widoku (SVProgressHud)
- (void)applicationDidBecomeActive:(UIApplication *)application
. Wydaje się, że jest to nowe zachowanie w Xcode7, ale o ile mogę powiedzieć, SVProgressHud odwoływał się do rootviewcontroller, zanim został ustawiony przez storyboard. Ostatecznie aktualizacja SVProgressHud do wersji 2.0 naprawiła błąd.źródło
Rozwiązanie Swift 2, które zadziałało dla mnie:
Wstaw poniższy kod w AppDelegate -> didFinishLaunchingWithOptions
self.window!.rootViewController = storyboard.instantiateViewControllerWithIdentifier("YourRootViewController") as? YourRootViewControllerClass
źródło