アプリケーションは、アプリケーションの起動の最後にルートビューコントローラーを持っていることが期待されます


383

コンソールに次のエラーが表示されます。

アプリケーションは、アプリケーションの起動の最後にルートビューコントローラーを持っていることが期待されます

以下は私のapplication:didFinishLaunchWithOptions方法です:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Set Background Color/Pattern
    self.window.backgroundColor = [UIColor blackColor];
    self.tabBarController.tabBar.backgroundColor = [UIColor clearColor];
    //self.window.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"testbg.png"]];

    // Set StatusBar Color
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent];

    // Add the tab bar controller's current view as a subview of the window
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

Interface Builderでは、UITabBarControllerのデリゲートはApp Delegateに接続されています。

誰でもこの問題を修正する方法を知っていますか?


5
割り当てを行う直前に、self.tabBarControllerのNSLogを実行します。メッセージは、コントローラーがnilの場合にのみトリガーされます。nilであり、接続が正しいことを確認した場合は、コードでコントローラーをインスタンス化してみてください。
FeifanZ 2011

ウィンドウの初期化をコメントしよう...この答えのチェック stackoverflow.com/a/33958144/1293445を
alabidモハマド

回答:


188

私も同じ問題を抱えていました。main.mを確認してください。最後の引数は、UIApplicationDelegateプロトコルを実装するクラスの名前に設定する必要があります。

retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");

49
もう1つのオプションは、アプリデリゲートクラスがmainにインポートされ、使用されるようにすることNSStringFromClassです。これが、Xcodeがmain.mファイルを作成する方法です。例:#import "AppDelegate.hその後int retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
sho

10
次のようにself.window初期化されていることを確認してくださいself.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
Raptor

1
上記のオプションを試しましたが、うまくいきませんでした。ストーリーボードは使用していません。
ジョウイ

3
変更を加えた後、同じ「アプリケーションが予期されています...」というメッセージが表示されましたが、影響はありませんでした。解決策は、完全に機能するOrdoDeiの回答(上記または下記を参照)でした。
Andrew

1
シミュレーターに白いビューが表示されているが、ストーリーボードからのレイアウトが表示されることが予想される場合は、ルートデリゲート関数「application didFinishLaunchingWithOptions ...」のコードを削除して、main.mでポイントされ、「returnはい;" 初期化。
Olivier de Jonge 2014年

435

AppDelegateで置換

 [window addSubview:[someController view]];

  [self.window setRootViewController:someController];

これは私のためのメッセージを取り除きました。それでも後続のウィンドウは表示されませんが、別の問題である可能性があります。ありがとう。
Jazzmine

3
UINavigationControllerを使用している場合は、最初に[[UINavigationController] initWithRootViewController:tableViewController]を使用し、次に上記のコード[self.window setRootViewController:self.navigationController]を使用してウィンドウのルートビューコントローラを設定する必要があります
emdog4

私はiOSの6使用しているようCocos2dが、これは私のためにそれを固定だから「// AddSubViewはiOS6上で作業をしません」と言うコメントがあります
アルモ

1
このaddSubview行は、Xcode / iOS SDKの初期バージョンのプロジェクトテンプレートの一部でした。アプリが長い道のりを戻ってきた場合、たとえそれを書いていない場合でも、あなたはそれを持っているかもしれません。
Seva Alekseyev 2013

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

70

ロードされた最初のView Controllerを変更しようとしたときに同じエラーが発生しました

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

最初はエラーの原因が正確にわからなかったので、エラーを絞り込んで何が悪いのかを見つけました。実際に画面に表示される前に、ビューの表示を変更しようとしたことがわかりました。したがって、解決策は、このコードをビューコントローラに移動することでした。

- (void)viewDidLoad

- (void)viewDidAppear:(BOOL)animated

エラーが表示されなくなりました。私の問題は特にUIAlertViewショーを作ることによって引き起こされました。

あなたのケースでは、tabBarControllerのアクティブなビューコントローラのコードをチェックすることをお勧めします(それはおそらくそのビューコントローラの問題なので)。それが機能しない場合は、コードではなくnibファイルで開始設定を設定してみてください。または、コードで設定したい場合は、コードをtabBarControllerのアクティブなビューコントローラの適切なメソッドに移動してみてください。

幸運を!


1
Warkst、答えてくれてありがとう。私の場合、コードをviewDidLoad:(フラグを追加せずに)外に移動することはできません。また、これを実行する必要もありません。とにかく、提案をありがとう!
ArtSabintsev

2
今日これが見つかり、同じ問題で、viewDidLoadでuialertの起動が表示されてうれしかったです。viewDidAppearに変更され、正常に動作します。iOS5でこれを変更することで、Appleがどれほど優れた成果を上げているかはわかりません。
GuybrushThreepwood、2011年

警告ビューがそれを引き起こしているという提案をありがとう、同じ問題が私にも起こりました。
Chris

1
整理するために削除する必要があるコードを教えていただけますか?にviewDidLoadデータを追加するなど、すべてのものを最初にセットアップするために、私を多くのことに使用していUITableViewます。viewDidAppear:一度だけ発砲させたいので、移動できません。
ジョウイ

1
問題は間違った機能ではありませんでした。問題は、viewDidLoad関数で[super viewDidLoad]を呼び出すのを忘れていて、nibのロードを事実上強制終了していたことです。同じことが何度も私に起こりました。
borrrden

47

「Empty Application」テンプレートから始めて、手動でXIBを追加すると、これが発生しました。私はサニーが提案したようにメインのニブの名前を設定することで解決しました。このシナリオで欠落しているステップは削除です

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

から

application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

Xibファイルで作成されたウィンドウのインスタンスを上書きするため。これは、ViewControllerを作成し、それをXIBファイル内のウィンドウとアプリデリゲートにも関連付けていることを前提としています。


これで修正されました。CoreDataを追加しようとしたStoryboardでTabbedアプリケーションを使用していて、この問題が発生しました。
gitaarik 2013年

これを追加すると、アプリケーションウィンドウにルートビューコントローラーが必要になるという2つの警告が表示されます。
George Asda

46

これは私に起こりました。.plistファイルを編集することで解決します。Main nibファイルのベース名を指定します(MainWindow.xibにする必要があります)。これがお役に立てば幸いです。

ここに画像の説明を入力してください


2
これは私のために働いた!これは、Xcode 4.2で空のプロジェクトを作成するときに機能します。MainWindowは存在せず、これを接続する必要があります。
jeevangs

「Info.plist」ファイルから「Main nib file base name」行を誤って削除したときに、問題が発生しました。この行を再度挿入すると、問題が修正されました。
rtovars

プロジェクトのプロパティでこれを設定することもできます。プロジェクト、ターゲットを選択します。これは、サマリー-> iPhone / iPadの展開情報で編集できます。
doekman 2013年

これは実際に私にとって問題であり、rootViewControllerでviewDidLoadとviewWillAppearを2回呼び出すことに関する複数の問題につながりました。私の場合、これを削除することが解決策でした
Whyo​​z

27

最近、ios5 sdkでプロジェクトをビルドするときに同じ問題に遭遇しました。最初は適切にビルドおよび実行されていましたが、その後エラーが表示されました。
私の場合、解決策はかなりシンプルでした。
欠けていたのは、アプリケーションターゲットの[概要]タブの[ メインインターフェイス ]プロパティがどういうわけか消去されたことです。そのため、もう一度設定する必要がありました。


これがポイントではなく、tabBarControllerがまだnilである場合は、常にプログラムでウィンドウとルートコントローラーを作成できます。フォールバックとして、次のコードをプロジェクトに追加しました

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{ 
    if (!window && !navigationController) {
        NSLog(@"Window and navigation controller not loaded from nib. Will be created programatically.");
        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
        UIViewController *viewController1, *viewController2;
        viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController_iPhone" bundle:nil] autorelease];
        viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController_iPhone" bundle:nil] autorelease];

        self.tabBarController = [[[UITabBarController alloc] init] autorelease];
        self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
        self.window.rootViewController = self.tabBarController;

    }
    else {
        [window addSubview:[tabBarController view]];
    }
    [self.window makeKeyAndVisible];
    return YES;
}

これは、翔のソリューションも実装されている場合にのみ機能します。


24

私はiOS9にアップグレードし、このエラーをどこからともなく始めました。私はそれを修正することができましたが、以下のコードを追加しました- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow *window in windows) {
    if(window.rootViewController == nil){
        UIViewController* vc = [[UIViewController alloc]initWithNibName:nil bundle:nil];
        window.rootViewController = vc;
    }
}

アプリにいくつのウィンドウがあり、すべてにルートビューコントローラーがあったかどうか知りたいです。ありがとう
DrAL3X 2015

5
:この回答は回避策であり、根本的な原因は修正されません。stackoverflow.com/a/33958144/1116061を
lipka 2015年

あなたは本当のヒーローです!
user2161301

21

上記の提案のどれも私の問題を解決しませんでした。鉱山はこれでした:

追加:

window.rootViewController = navigationController;

後:

[window addSubview:navigationController.view];

私の代理人の

- (void)applicationDidFinishLaunching:(UIApplication *)application {

20
  • Nibファイルで「ウィンドウ」を選択します
  • 「属性インスペクター」で「起動時に表示」をチェックします

画像![]

  • これは、nibファイルが手動で作成されたときに発生します。
  • この修正は、ストーリーボードモードではなく、通常のnibモードで機能します

これはストーリーボードモードでのみ見つかると思います。
ArtSabintsev

いいえ、このプロジェクトは通常のnibモードでした。 これはストーリーボードモードのスクリーンショットです。「起動時に表示」対「初期ビューコントローラーは」
bearMountain

3
ウィンドウのnibファイルが手動で作成され、「起動時に表示」がデフォルトでオフになっている場合、アプリの起動後にこのメッセージが表示され、問題が解決します。
ZYiOS

ああ、ありがとう!!!最後に、この迷惑な警告の解決策です。持っmakeKeyAndVisibleていても問題は解決しません。これだけで警告が解決されました。ありがとうございました!
tacos_tacos_tacos 2012

「これは通常のnibモードで発生します-ストーリーボードモードではありません」あまり当てはまりません。私は同じ問題に直面していますStoryboard
thesummersign

19

iOS5用のRootViewControllerを追加する方法

これまでにアプリがRootViewControllerを使用していなかった場合は、[ファイル]> [新規作成]> [新規ファイル]をクリックして作成します。選択しUIViewController subclass 、名前をRootViewControllerを、(あなたが既に持っていると仮定して)ユーザ・インタフェースのためでXIBをオフにし、あなたのAppDelegate :: didFinishLaunchingWithOptionsにこのコードを置きます

rootViewController = [[RootViewController alloc] init];
window.rootViewController = rootViewController;

確かに-あなたはRootViewController.hをインポートして変数を作成する必要があります

ここに、RootViewControllerとAppDelegateに関する素晴らしい記事があります。


cupsofcocoa.comの記事のリンクは機能していません-どこかにコピーがある場合はどうでしょうか?
Ríomhaire

1
これは、binpress.comに移動答えでリンクを更新しました
レミー

それは素晴らしいリンクです。よく読んで、何が起こっているのかを説明します。(Objective-Cを最初に学びたいので)古い本を使用してこの問題に遭遇しましたが、古いテンプレートを持たない最新のXCode 7でコードを書いています。
ibaralf 2016

11

私にもこのエラーがありましたが、以前にリストした私の答えのどれとも違って、新しく生成されたコントローラー(xcode 4.2、ios5)でメソッド 'loadView'のコメントを外したためです。

 //Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView  
{
}

このメソッドはプログラムでビューを作成するためのものであるとさえ教えてくれましたが、viewDidLoadなどの他のメソッドと非常に似ているため、通常は使用しているのでキャッチできませんでした。

プログラムでビュー階層を作成していない場合は、単にnibまたはストーリーボードを使用してそのメソッドを削除します。


これにより問題が発生する可能性があることを確認できました。TableViewに関するチュートリアルに従って、loadViewでデリゲートセットを作成することで、同じ状況になりました。そのコードをviewDidLoadに移動してloadViewを削除した後、すべてが必要に応じて機能し始めました。
Eugen

ロードビューを引き続き使用できますが、[super loadView]を追加します。初めに。
ヘルマンクレッカー、2011

1
うーん... loadViewのドキュメントには、スーパーメソッドを呼び出さないように明記されています。
ジョシュアサリバン

ストーリーボードでデフォルトのUIViewControllerをオーバーライドしましたが、UIViewControllerサブクラスを作成するためのテンプレートコードでloadViewがデフォルトで有効になっていることがわかりました。この愚かなことで1時間以上無駄にしています。これを投稿してくれてありがとう!
slycrel 2012年

11

私もこの問題を抱えていました。xcode4.2.1でプロジェクトを実行しました。私はここですべてのコメントを読みましたが、誰も私にとってクールではありません。しばらくして、コードにコメントしたことがわかりました。

//self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

次に、コメントを外します。私にとってはすべて大丈夫です。これが皆さんに役立つことを願っています。


コード:「self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];」エラーが発生したため、削除しました。
Grigori A.

11

アプリケーションのデリゲートにこの関数があることを確認してください。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions {
   return YES;
}

didFinishLaunchingWithOptionsがYESを返すことを確認してください。「return YES」行を削除すると、エラーが発生します。このエラーは、ストーリーボードのユーザーに特によく見られます。


多くの称賛、これは私が欲しかったものです(ストーリーボード付きの空のプロジェクト)
Shtirlic

2
こっちも一緒。ありがとう。空のアプリケーションを作成する場合、このメソッドはウィンドウの手動作成で満たされます。これは、単にYESを返すように変更する必要があります。Thx
ベンG

10

MenuViewController私が追加した最初のビューで:

MenuViewController *menuViewController = [[MenuViewController alloc]init];
self.window.rootViewController = menuViewController;

App Delegateメソッドで:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
}

うまくいきました。


10

iOS 5.0前後で若干の変更があったため、ルートビューコントローラが必要です。コードがGLES2Sampleなどの古いサンプルコードに基づいている場合、これらのコードサンプルではルートビューコントローラーは作成されませんでした。

(たとえば、GLES2Sampleなど)を修正するapplicationDidFinishLaunchingために、ルートビューコントローラーを作成し、それにglViewをアタッチします。

- (void) applicationDidFinishLaunching:(UIApplication *)application
{
  // To make the 'Application windows are expected
  // to have a root view controller
  // at the end of application launch' warning go away,
  // you should have a rootviewcontroller,
  // but this app doesn't have one at all.
  window.rootViewController = [[UIViewController alloc] init];  // MAKE ONE
  window.rootViewController.view = glView; // MUST SET THIS UP OTHERWISE
  // THE ROOTVIEWCONTROLLER SEEMS TO INTERCEPT TOUCH EVENTS
}

これで警告が消え、それ以外の場合はアプリに影響はありません。


9

代わりに、タブバーコントローラーのIBOutletをInterface Builderのルートビューに接続してみてください

self.window.rootViewController = self.tabBarController;

しかし、実際にはそのようなエラーを見たことがありません。


8

私は次のようにして問題を解決しました(上記の他の解決策は役に立ちませんでした):

「メインインターフェース」に関連付けられたプルダウンメニューから別のエントリを選択し、「メインウィンドウ」を再度選択して再構築します。

ここに画像の説明を入力してください


8

私は同じ問題に出くわしましたが、私は使っていました storyboard

storyboard InitialViewControllerを自分のウィンドウに割り当てますrootViewController

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
...
UIStoryboard *stb = [UIStoryboard storyboardWithName:@"myStoryboard" bundle:nil];
self.window.rootViewController = [stb instantiateInitialViewController];
return YES;
}

これで問題が解決しました。


7

Xcode 4.3にアップグレードした直後に、同じ問題が発生し始めました。最初からプロジェクトを開始したときのみです(つまり、空のプロジェクトを作成してから、UIViewControllerを作成してから、別のnibファイルを作成します)。

以前使用していたすべての行を配置し、正しい接続が確立されていることを確認した後、そのエラーが発生し続け、ビューコントローラー(rootControllerとして設定されている)を通じてロードしようとしたnibファイルがシミュレーターに表示されませんでした。

Xcodeを使用して単一のビューテンプレートを作成し、それを私のコードと比較したところ、最終的に問題が見つかりました。

Xcode 4.3では、デフォルトでメソッド-(void)loadViewが追加されているようです。ビューコントローラ実装セクションに移動します。その中のコメントを注意深く読んだ後、問題が何であるかが明らかになりました。コメントは、プログラムでビューを作成する場合はloadViewメソッドをオーバーライドすることを示しています(言い換えれば、言い換えます)。それ以外の場合は、nibを使用する場合はloadViewをオーバーライドしないでください。このメソッドの内部には他に何もなかったので、実際にはnibファイルを使用してメソッドをオーバーライド(および何もしない)していたため、エラーが発生しました。

解決策は、loadViewメソッドを実装セクションから完全に削除するか、[super loadView]を追加して親メソッドを呼び出すことでした。

他のコードを追加すると実質的に上書きされるため、NIBファイルを使用する場合は削除するのが最善です。


それはまさに私の問題でした!loadView実装を追加しましたが、superを呼び出しませんでした。他のいくつかのコードを変更しましたが、私が一体何をしたのか思い出せませんでした。その変更は無害であるように思われたので、私は2時間スタックしました。
LearnCocos2D 2013年

6

ログに同じエラーメッセージがありました。application:didFinishLaunchingWithOptionsにUIAlertViewポップアップが表示されました。ルートビューコントローラーが読み込みを完了するまでの時間を考慮して、alertViewの呼び出しを遅らせることで解決しました。

アプリケーション:didFinishLaunchingWithOptions:

[self performSelector:@selector(callPopUp) withObject:nil afterDelay:1.0];

1秒後に呼び出す:

- (void)callPopUp
{
    // call UIAlertView
}

おかげで、これは私の問題を解決しました。ウィンドウがロードされるまで、アラートが表示されるまで待つ必要があります。私の場合は、[alert performSelector:@selector(show)withObject:nil afterDelay:1.0]を実行しただけです。
deepwinter 2013

6

私も同じ問題を抱えていました。私が「ゼロから」ウィンドウベースのアプリケーションを構築している場合は、以下を実行する必要があります(注、これらはXcode 4.2の手順です)。

0.アプリケーションデリゲートがUIApplicationDelegateプロトコルに準拠していることを確認してください。

たとえば、デリゲートがMyAppDelegateであるとします。MyAppDelegate.hには、次のようなものが必要です。

@interface MyAppDelegate : 
    NSObject <UIApplicationDelegate> // etc...

1. main.mでアプリケーションデリゲートを指定します

例えば、

#import "MyAppDelegate.h"

int main(int argc, char *argv[])
{
  @autoreleasepool {
    return UIApplicationMain(argc, argv,
      nil, NSStringFromClass([MyAppDelegate class]));
  }
}

2.メインウィンドウインターフェースファイルを作成します。

これを行うには、プロジェクトを右クリックし、[新しいファイル]を選択します。そこから、iOS-> User InterfaceセクションからWindowを選択します。

ファイルをプロジェクトに追加したら、プロジェクトの概要に移動します(プロジェクトを左クリックして、概要をクリックします)。iPhone/ iPodの展開情報(および必要に応じて対応するiPadのセクション)の下で、メインインターフェイス」コンボボックス。

3.インターフェースエディタですべて接続します

ファイルリストでインターフェースファイルを選択して、インターフェースエディターを起動します。

[ユーティリティ]ペインが開いていることを確認します。

[ユーティリティ]ペインの[オブジェクト]リストからWindowオブジェクトの下の上のスペースにオブジェクトをドラッグして、新しいオブジェクトを追加します。オブジェクトを選択します。ユーティリティペインでIDインスペクタをクリックします。クラスをアプリケーションのデリゲート(この例ではMyAppDelegate)に変更します。

MyAppDelegateの接続インスペクターを起動します。ウィンドウアウトレットを、インターフェイスファイルに既に存在するウィンドウに接続します。

左側の[ファイルの所有者]をクリックし、[ユーティリティ]ペインの[IDインスペクター]をクリックします。クラスをUIApplication

ファイルの所有者の接続インスペクタを表示します。デリゲートアウトレットをMyAppDelegateオブジェクトに接続します。

4.最後に、そして非常に重要なことですが、インターフェースファイルのWindowオブジェクトをクリックします。属性インスペクタを開きます。「起動時に表示」がチェックされていることを確認してください。

それが私のためにそれを機能させるために私がしなければならなかったすべてです。幸運を!


6

MTStatusBarOverlayを使用すると、このエラーが発生します。

MTStatusBarOverlayは、ルートコントローラーのない追加のウィンドウ([[UIApplication sharedApplication] windows)を作成します。

これは問題を引き起こさないようです。


よろしいですか?あなたはそれをテストしましたか?
Sergey Grischyov

私はそれがウィンドウを作成することを確信しています、そしてそれは私のアプリに問題を引き起こさないと確信しています。
混乱しているVorlon、

MTStatusBarOverlayにダミーのVCを設定して修正することができます。
ウェズリー

これはまさに私の問題でした。通知バー用に追加されたウィンドウを使用して同様の設定を行い、コメントするとエラーが消えた!この場合、害はないようです。
アーロンジンマン2014

6

XCode 4.6.3とiOS 6.1を使用して、UIをストーリーボードに置き換えた後、同じエラーを受け取りました

AppDelegateのdidFinishLaucnhingWithOptionsからすべてのコードをクリアすることで解決しました

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}

5

OrdoDeiは正確で価値のある答えを出しました。この回答を追加didFinishLaunchingWithOptionsするのは、彼の回答を使用する方法の例と、ナビゲーションコントローラーに関する他のユーザーのコメントを説明するためだけです。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // Override point for customization after application launch.

    // Instantiate the main menu view controller (UITableView with menu items).
    // Pass that view controller to the nav controller as the root of the nav stack.
    // This nav stack drives our *entire* app.
    UIViewController *viewController = [[XMMainMenuTableViewController alloc] init];
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

    // Instantiate the app's window. Then get the nav controller's view into that window, and onto the screen.
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // [self.window addSubview:self.navigationController.view];
    // The disabled line above was replaced by line below. Fixed Apple's complaint in log: Application windows are expected to have a root view controller at the end of application launch
    [self.window setRootViewController:self.navigationController];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

4

これは私が誤ってコメントアウトしたために起こりました:

[self.window makeKeyAndVisible];

から

- (BOOL)application:(UIApplication*) didFinishLaunchingWithOptions:(NSDictionary*)

4

xcodeの概要画面で初期View Controllerを設定することができました。

左側のファイルエクスプローラーで一番上のプロジェクト名をクリックします(小さな設計図アイコンが表示されます)。中央の列で、「TARGETS」の下のプロジェクト名をクリックします(横に小さな鉛筆の「A」アイコンが表示されているはずです)。「iPhone / iPod導入情報」の下で「メインインターフェース」を探します。ドロップダウンからオプションを選択できるはずです。


4

「正解」の回答に加えて、それは正しいです(UIApplicationMainの4番目のパラメーターはメインコントローラーの名前でなければなりません)。コメントをいくつか追加します。

最近、私のアプリの「モデル」をMainWindow.xibを使用してプログラムでウィンドウを構築するように変更しました。アプリは、MainWindowを自動的に作成した古いテンプレートを使用しました。iPhone 5で別のコントローラービューXIBをサポートしたかったので、アプリデリゲートを作成するときにプログラムで正しいXIBを選択する方が簡単です。MainWindow.xibもプロジェクトから削除しました。

問題は、UIApplication mainの4番目のパラメーターを入力するのを忘れており、Project Summaryの「Main Interface」からMainWindowを削除するのを忘れたためです。

これにより、大きな問題が発生しました。開発デバイスでは「アプリケーションは予期される...」という無害な警告が表示されましたが、App Storeに移動すると、MainWindowがバンドルに含まれなくなったため、コンシューマ電話で壊れてクラッシュしました。バグ修正のために迅速なレビューをリクエストする必要がありました。

別の現象として、設定が変更されてアプリが前面に表示されると、空白のUIViewのような白いブロックが表示されることがありました。iPhone 5では、320x480ブロックであることが明らかでした。おそらく、欠落しているMainWindowは、古いサイズを使用して、開発モードで作成されていました。クラッシュの最初の報告が受信トレイに届いたとき、私はこのバグを発見しました。

XCodeからではなくApp Storeからアプリをインストールすると、アプリが実際にクラッシュし、MainWindowの問題がログに表示されたため、デバイスとIOSバージョンの特別な組み合わせではないことがわかりました。


4

マイクフリンの答えに追加するには、Xcode 7にアップグレードしてiOS 9デバイスでアプリを実行しているので、これを (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

// Hide any window that isn't the main window
NSArray *windows = [[UIApplication sharedApplication] windows];
for (UIWindow *window in windows) {
    if (window != self.window) {
        window.hidden = YES;
    }
}

アプリにいくつのウィンドウがあり、すべてにルートビューコントローラーがあったかどうか知りたいです。ありがとう
DrAL3X 2015

3

この問題は、Interface Builderが正しく設定されていない場合に発生します。

アプリデリゲートのウィンドウとviewControllerアウトレットが接続されていることを確認します。

MainWindow.xibで、コントロールを押したまま、App Delegateをクリックし、Windowオブジェクトにドラッグします。ウィンドウを選択します。コントロールを保持し、アプリデリゲートを再度選択し、ルートビューコントローラーにドラッグして、viewControllerを選択します。


3

このエラーは、MainWindow.xibのファイルの所有者が正しく設定されていない場合にも表示されます。

ファイルの所有者はUIApplicationです
->ウィンドウに接続されたウィンドウアウトレットを持つアプリデリゲートクラスの挿入オブジェクト


xibファイルを手動で作成し、このエラーが発生し始めました。本当にありがとう!
RawMean 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.