2013-02-03 18 views
11

私は、メインのストーリーボードを手作業でapplication:didFinishLaunchingWithOptionsにロードするユニバーサルアプリを持っています。デバイスタイプに基づいて異なるストーリーボードを選択する

iPhoneとiPadの2つのストーリーボードには、~iPhone~iPadの接尾辞があります。私が使って自分のストーリーボードを搭載しています:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
self.initialViewController = [storyboard instantiateInitialViewController]; 

これは、コンソールにUnknown class ViewController in Interface Builder file.を出力しますので、どうやらそれは正しいストーリーボードをロードしていません。しかし、[UIStoryboard storyboardWithName:@"MainStoryboard~iPhone" bundle:nil];を使用するとうまく動作しますが、もちろんiPhone用にしか動作しません。

私には何が欠けていますか?名前の接尾辞を使用して正しいストーリーボードを自動的に選択するにはどうすればよいですか?

+0

なぜあなたはプロジェクトの設定に行き、iphoneの配備情報とipadのストーリーボードをipad配備情報にセットするのはなぜですか?あなたはデバイスごとに複数のストーリーボードを使用しますか?ストーリーボードを手動でロードする目的は何ですか? – guenis

+0

私がやろうとしているのは、IIViewDeckControllerをルートビューコントローラとして設定することです。そのため、ストーリーボードを自動的にロードすることは役に立ちません。 –

+0

これは一部のバージョンのバグです(iOS 6.1.2では壊れていましたが、以前は同じプロジェクトで動作していました)。アップル社のドキュメントによると、〜iphoneの接尾辞は普遍的で、すべてのリソースの読み込み(イメージ、NIBファイル - 以前の経験では、すべて)に影響するはずです。ストーリーボードが壊れていて、セレクターを何とかスキップしているようです。 – Adam

答えて

12

私は、ファイル名の接尾辞に基づいてストーリーボードの自動選択について認識していません。

if ([[UIDevice currentDevice] userInterfaceIdiom] ==UIUserInterfaceIdiomPad) { 
    UIStoryboard *storyboard = 
    [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil]; 
} else { 
    [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; 
} 

しかし、あなたはspecifcビューコントローラで起動するためにこれをやっている場合は、あなたがする必要があるすべては、お好みのビューコントローラに「スタート」の矢印をドラッグしている:あなたはiPhone対iPad用を選択する userInterfaceIdiomを使用することができますストーリーボード

またはIN - 、ストーリーボードのビューコントローラを選択した属性のinstpectorに移動して起動するアプリケーションが指定したストーリーボードを選択しながら、appdelegateクラスでisInitialViewController

+1

私は、XIBファイルや画像のようなファイル名の接尾辞に従ってストーリーボードが自動的に選択されると考えました。ありがとう! –

+0

deviceStoryboardWithName:bundle:などのカテゴリをUIStoryboardに追加すると、適切な接尾辞を追加してこのコードをカプセル化し、次にstoryboardWithName:bundle:を呼び出すことができます。それは、コードを読みやすく、フォローしやすくします。 – GilroyKilroy

+1

info.plistでiPhoneとiPad用に別々のストーリーボードを設定できます。ここでは鉱山からの生の出力は次のようになります。 UIMainStoryboardFile メイン UIMainStoryboardFile〜ipadの のiPad ので、iPadのストーリーボードを設定するための別のキーがあります。私の設定の対応するファイル名はMain.storyboardとiPad.storyboardです。 –

0

//をチェック。

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

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 
    { 
     storyboard1 = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:[NSBundle mainBundle]]; 
    } 
    else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    { 
     storyboard1 = [UIStoryboard storyboardWithName:@"Main_iPad" bundle:[NSBundle mainBundle]]; 
    } 
    UIViewController *vc = [storyboard instantiateInitialViewController]; 

    // Set root view controller and make windows visible 
    self.window.rootViewController = vc; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 
0

あなたはこの

  • のように(iPhone用)Main.storyboard(iPad用)
  • Main_iPad.storyboard

をストーリーボードに名前を付け、この

ようにそれらを選択することができます
- (UIStoryboard *)deviceStoryboardWithName:(NSString *)name bundle:(NSBundle *)bundle { 
    if (IS_IPAD) { 
     NSString *storyboardIpadName = [NSString stringWithFormat:@"%@_iPad", name]; 
     NSString *path = [[NSBundle mainBundle] pathForResource:storyboardIpadName ofType:@"storyboardc"]; 

     if (path.length > 0) { 
      return [UIStoryboard storyboardWithName:storyboardIpadName bundle:bundle]; 
     } 
    } 


    return [UIStoryboard storyboardWithName:name bundle:bundle]; 
} 
0

これは、あなたのinfo.plistファイル内で直接設定することができます。どんなプログラミング努力も必要ありません。 「メインストーリーボードファイルのベース名」という名前のプロパティがあり、デフォルトでは「メイン」となります。

「メインストーリーボードファイルベース名(iPad)」という名前の別のプロパティを追加して、iPadに使用することができます。 (UIMainStoryboardFileキーがメインとして設定されている場合)、単純にメイン〜iPad.storyboardという名前の二ストーリーボードを追加することも可能である私の知る限り

<key>UIMainStoryboardFile</key> 
<string>Main</string> 
<key>UIMainStoryboardFile~ipad</key> 
<string>iPad</string> 

これはplistの中に生の出力は次のようになります。そしてそれはiPadsのために選ばれるでしょう。しかしこれをしばらく試してはいけません。

関連する問題