90

関数実行後

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

4

10 に答える 10

176

エラーメッセージから:

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

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

[window addSubview:viewController.view];

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

[window setRootViewController:viewController];
于 2015-06-18T12:29:47.193 に答える
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;
    }
}

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

于 2015-09-19T02:34:33.890 に答える
13

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

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

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

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

于 2015-11-27T13:09:26.823 に答える
3

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

iOS9 では、その App は AppStore からダウンロードした場合でも問題なく動作しますが、Xcode 7 で新しくビルドして iOS 9 で実行した場合はそうではありません。以前はありました!これにより、ルート ビュー コントローラーが状態復元コードの呼び出しを見逃していました。

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

于 2015-10-04T15:44:53.353 に答える
2

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

  1. 新しいプロジェクトを作成します。Single View Application で問題ありません。
  2. Main.storyboard ファイルをプロジェクトにコピーするか、独自のファイルを作成することができます。
  3. プロジェクト設定を開き、メイン インターフェイスを Main.storyboard に設定しますメイン インターフェイスを Main.storyboard に設定します
于 2015-09-21T17:13:14.767 に答える
2

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

于 2015-09-17T03:42:53.500 に答える
1

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

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController
于 2015-09-22T11:10:41.283 に答える
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 に更新すると、バグが修正されました。

于 2016-05-31T18:40:20.083 に答える