web-dev-qa-db-ja.com

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でビルドして実行するにはどうすればよいですか?

82
andrew wang

エラーメッセージから:

アプリケーションウィンドウには、アプリケーション起動の最後にルートビューコントローラーが必要です。

この「古い」プロジェクトは何歳ですか?それが数年以上の場合、あなたはまだ持っています:

[window addSubview:viewController.view];

代わりに次のものに置き換える必要があります。

[window setRootViewController:viewController];
167
James Webster

アプリデリゲートでself.windowのrootViewControllerを既に設定し、実行時にこのエラーが引き続き発生する場合、UIApplicationに複数のウィンドウがあり、そのうちの1つには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;
    }
}

更新:どうやら通常この問題を引き起こすステータスバー専用のウィンドウがあります。上記のコードはこのエラーを修正するはずです。

36
Bms270

XCODE 7では、すべてのWindowsにrootViewControllerが必要です。簡単に使用できます。

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

UIWindowのみを使用する必要がある場合(チュートリアルの簡単な例-Xcode 7より前)にうまく機能しています!

21
Envoy

IOS 9.1(?)またはXcode 7.1以降、application(_:didFinishLaunchingWithOptions:)中にインスタンス化されたUIWindowは、メソッドを終了する前にrootViewControllerを設定する必要があるようです。

以前は、そのメソッド中にメインウィンドウのみにrootViewControllerを設定すれば十分でした。これで、すべてのUIWindowインスタンスに有効なrootViewControllerプロパティが必要になります。

ここでの原因は、UIWindowと、この間に新しいUIWindowインスタンスを初期化しようとするサードパーティライブラリ(ステータスバーメッセージオーバーレイなど)を使用する場合、独自のコードである可能性があります。 。

NOTE:メインウィンドウでrootViewControlerを設定しない場合、またはストーリーボードが正しく設定されていない場合も、同じエラーが発生します。これらのケースは非常に明白であり、修正するのが簡単なので、これをサイドノートとして言及します。

13
lipka

これも今日私に噛みつき、それを修正するのに数時間かかりました:私のアプリは「MainWindow.xib」にウィンドウを持ち、Navigation Controllerと付随するルートView Controllerを備え、すべて適切な順序で自動的にインスタンス化されました、Xcode 6およびiOS8で。

IOS9では、AppStoreからダウンロードしたときにアプリは引き続き正常に動作しますが、Xcode 7で新しくビルドしてiOS 9で実行するとnotになります。この時点で、アプリのデリゲートはapplicationDidBecomeActive:メソッドを実行してルートビューコントローラーを実行します以前は以前と同じようにnotロードされました!そのため、ルートビューコントローラーは、状態の復元コードの呼び出しを見逃していました。

ルートビューコントローラーをコードで自分でインスタンス化し、viewDidLoadから明示的に状態を復元することで、これを修正しました。

3
RickJansen

アプリですべてのウィンドウのrootviewcontrollerプロパティを設定する必要があります

2
alla

以下のコードのように、app-delegate.rbのUIViewControllerであるnavigationControllerにrootViewControllerを設定するだけです。私はRubyが初めてですが、これが助けになることを願っています...

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController
1
BigPun86

私はこの問題に私が多かれ少なかれ継承したアプリで来ました。ストーリーボードがアプリのメインインターフェイスとして適切に設定されていること、およびストーリーボードに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'

- (void)applicationDidBecomeActive:(UIApplication *)applicationで呼び出されるビューロジック(SVProgressHud)が原因でクラッシュが発生していることをさらに調査した結果、発見したもの。これはXcode7の新しい動作のようですが、ストーリーボードによって設定される前にSVProgressHudがrootviewcontrollerを参照していたことがわかります。最終的にSVProgressHudを2.0に更新すると、バグが修正されました。

1
Bueno

私のために働いたSwift 2ソリューション:

以下のコードをAppDelegateに挿入します-> didFinishLaunchingWithOptions

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

IOS 9ではなくiOS 8で機能する古いプロジェクトがあります。メインインターフェイスがMainWindow.xibに設定されている場合は、ストーリーボードに更新します。これは私のためにそれを修正しました:

  1. 新しいプロジェクトを作成します。シングルビューアプリケーションで問題ありません。
  2. Main.storyboardファイルをプロジェクトにコピーするか、独自に作成することもできます。
  3. プロジェクト設定を開き、メインインターフェイスをMain.storyboardに設定します Set your Main Interface to Main.storyboard
0
Adrian