Xcode 7、iOS 9でプロジェクトを実行すると、「アプリケーションウィンドウには、アプリケーションの起動の最後にルートビューコントローラーがあるはずです」エラー


89

関数を実行した後

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


Xcode 7はベータ版なので、深刻な開発作業にはXcode 6に戻る必要があります。
Paul R


こんにちは私はこのエロを取得しています:-***-[UIApplication _runWithMainScene:transitionContext:completion:]、/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m: 3294これを解決する方法
Akash Raghani 2015

回答:


175

あなたのエラーメッセージから:

アプリケーションウィンドウには、アプリケーションの起動の最後にルートビューコントローラーがあることが期待されます

この「古い」プロジェクトは何歳ですか?数年以上経過している場合でも、まだありますか:

[window addSubview:viewController.view];

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

[window setRootViewController:viewController];

1
私も同じ問題を抱えており、それはiOS 9の問題だと思います。私のプロジェクトはiOS 7および8で動作します。何らかの理由で、ストーリーボードからのビューが正しく設定されていません。
David Snabel-Caunt 2015年

3
どうもありがとうございました 。答えは、エラーメッセージである:「アプリケーションウィンドウ」私は私のプロジェクトに2つの窓がある見つける、1は正常widdowで、他はと呼ばれるサードパーティ製のmodualである
アンドリュー王

3
MTStatusBarOverlayにはRootViewControllerがありません。iOS9では、すべてのウィンドウにrootViewControllerが必要です。
andrew wang

1
はい、結局同じ問題が見つかりました。私のアプリには、ルートビューコントローラーがない追加のウィンドウがあります。
David Snabel-Caunt、2015年

1
私のために働く解決策を見つけました:stackoverflow.com/a/32719949/1881895
バラスト

37

アプリデリゲートで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;
    }
}

更新:どうやらこの問題の原因となるステータスバー専用のウィンドウがあるようです。上記のコードはこのエラーを修正するはずです。


2
ありがとう!! これは私にとって問題であることが判明しました。メインビューコントローラーを設定しましたが、アプリに2つ目のウィンドウが表示されていました。
n13

とてもしっかりしています...私は新人ではないので、iOS 9.1を実行しているXcode 7.1に更新すると、ステータスバーに専用のウィンドウが表示されます...もちろん、そうですか?ステータスバーが誰かにとって意味がある場合は、ステータスバーを非表示にしています。
whyoz

うわー、アプリのレビューのために12個中2個のアプリがクラッシュしましたが、これで問題が解決したようです。
Andrew Smith、

うまくいきました!お奨め「通常、この問題の原因となるステータスバー専用のウィンドウがあるようです。」今後の予定はわかりませんでした。
eGanges

1
このメソッドを使用すると、rootViewControllerでviewDidLoadとviewWillAppearが2回呼び出される可能性があります。手動で初期化ウィンドウを使用している場合は、plistを確認し、この回避策を使用した後に2回呼び出されることが確認された場合は、Window.xibが「メインnibファイルのベース名」として定義されていないことを確認してください。次に、通常のように、このコードとsetRootViewControllerを削除するだけです。
16

21

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

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

UIWindowのみを使用する必要がある場合は問題なく動作します(チュートリアルの簡単な例-Xcode 7以前)。


Stack Overflowへようこそ!投稿を編集して、コードの機能と問題を解決する理由を詳しく説明してください。通常、コードが含まれているだけの回答(たとえそれが機能していても)は、通常、OPが問題を理解するのに役立ちません。
SuperBiasedMan 2015

おかげで、私のiOS〜3–8警告=> iOS 9クラッシュは回避できましたが、リークに関する静的アナライザー警告が表示されました。そのため、applicationDidFinishLaunchingでの割り当てを使用して、宣言をヘッダーのインターフェイスに移動しました。次に、[vc release]を割り当て解除に追加しました。
フラッシュシェリダン2016

13

iOS 9.1(?)またはXcode 7.1以降、UIWindowインスタンス化中にインスタンス化されたもの application(_:didFinishLaunchingWithOptions:)はすべてrootViewController、そのメソッドを終了する前にセットを持っている必要があります。

以前は、メインウィンドウだけがrootViewControllerそのメソッドの間にセットを持っていることで十分でした。これで、すべてのUIWindowインスタンスに有効なrootViewControllerプロパティが必要になります。

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

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


あなたは素晴らしいです:D、ありがとう、私はウィンドウの初期化をコメントし、すべて大丈夫です
mohammad alabid '30 / 11/15

3

これも今日私に噛みついて、修正するのに数時間かかりました。私のアプリのウィンドウは "MainWindow.xib"にあり、ナビゲーションコントローラーとそれに付随するルートビューコントローラーを備えており、すべて適切な順序で自動的にインスタンス化されました、Xcode 6およびiOS8。

iOS9では、AppStoreからダウンロードした場合でもアプリは正常に動作しますが、Xcode 7で新しくビルドしてiOS 9で実行した場合は動作しません。アプリデリゲートがapplicationDidBecomeActive:メソッドを実行しているとき、ルートビューコントローラーは読み込まれないため、以前に使用されました!これにより、ルートビューコントローラーが私の状態復元コードの呼び出しを見逃しました。

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


2

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


あなたの答えが私を助けました
Aznix、2015年

2

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

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

1

以下のコードのように、rootViewControllerをapp-delegate.rbのUIViewControllerであるnavigationControllerに設定するだけです。私はルビーの新人ですが、これが役に立てば幸いです...

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController

1

この問題は、継承したアプリが多かったか少なかったときに発生しました。ストーリーボードがアプリのメインインターフェイスとして正しく設定されていることと、ストーリーボードに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に更新すると、バグが修正されました。


0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.