別のストーリーボードにセグエ?


133

ストーリーボードを別のストーリーボードに分割したり、ストーリーボードを別のストーリーボードのビューコントローラーに埋め込んだりすることはできますか?私は配置する必要があるUITabBarController中でUINavigationController、私はそれら素敵を維持し、分離したいと思います。



5
すばらしい質問です。1つのストーリーボードを持つことは、チームベースのプロジェクトにとって悪夢です。私たちは定期的にプロジェクトを「フロー」ごとにストーリーボードに分割します(ログイン用に1つのストーリーボード、ニュースフィードと関連画面用に1つのストーリーボードなど)。これにより、開発者がストーリーボードに触れるたびに発生するマージの競合の数を最小限に抑えることができます。
Brian Sachetta、2015年

@BrianSachetta他に何をしますか?共有する他の同様のヒント?
ハニー

チームの構成によって異なります。本当に必要な場合は、すべてのユーザーインターフェイスを個別の.xibファイルに含めることができます。これは、ストーリーボードが存在する前の状態です。このアプローチにはプラスとマイナスがあります。有利な点は、プロジェクトの他の開発者と競合することはほとんどないということです。欠点は、アプリのフローを視覚的に確認するのが難しい場合があることです。
Brian Sachetta

回答:


201

はい。ただし、プログラムで行う必要があります。

// Get the storyboard named secondStoryBoard from the main bundle:
UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];

// Load the initial view controller from the storyboard.
// Set this by selecting 'Is Initial View Controller' on the appropriate view controller in the storyboard.
UIViewController *theInitialViewController = [secondStoryBoard instantiateInitialViewController];
//
// **OR**  
//
// Load the view controller with the identifier string myTabBar
// Change UIViewController to the appropriate class
UIViewController *theTabBar = (UIViewController *)[secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];

// Then push the new view controller in the usual way:
[self.navigationController pushViewController:theTabBar animated:YES];

11
ストーリーボードを別にしたいだけです。彼らはすでに散らかりすぎています。
Ry-

11
本の章のように、複数のストーリーボードが必要だと思います。
finneycanhelp

48
同じアプリケーションで複数の開発者が作業している場合、ストーリーボードxmlのバージョン管理の競合を解決するのは非常に困難な場合があるため、複数のストーリーボードがあると非常に便利です。
Lee

14
iOS 9とXcode 7では、クロスストーリーボード参照がサポートされるようになりました。:-)
Quinn Taylor

1
milcziの答えを参照してください。UIでこれを非常に簡単に実行できます。
Tim

117

Xcode 7以降では、ストーリーボードリファレンスを使用してこれをグラフィカルに行うことができます。

参照

ストーリーボード参照をストーリーボードに追加します。ViewControllerとストーリーボードリファレンスの間にセグエを作成(Ctrl +ドラッグ)

次に、このフィールドに入力します。

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

「Tutorial」は「Tutorial.storyboard」ファイルで、「MainTutorialController」はViewControllerSettingsの「Storyboard ID」フィールドです


1
良い情報ですが、質問にはios5のタグが付いているため、これは当てはまりません。
lnafziger 2016

10
@Inafzigerはい。ただし、この質問はiOS 9を使用しているユーザーの検索結果の上部に表示されます
ブライアンオグデン

これはXCode 7以降で利用できます。詳細については、stackoverflow.com
Simon Pickup

これは機能しましたが、ナビゲーションバーを維持する必要もあります。ナビゲーションバーなしで表示されます。ナビゲーションとボタンを維持して履歴に戻す方法はありますか?それがどのストーリーボードに由来するかは関係ありませんか?
Gil Beyruth 2017

これはiOS 10で機能しています。セグエごとに1つのストーリーボード参照が必要であり、複数のセグエを1つの参照ポイントに接続できないことに注意しました。
マークリード2017年

10

UIStoryboardSegueは抽象クラスであるため、手動でセグエを実行することはできません。perform何かを実行するには、サブクラス化して実装する必要があります。彼らは本当にストーリーボードで作成されることを意図しています。ただし、ビューコントローラーを手動でプッシュすることもできます。これは優れたソリューションです。lnafzigerの答えはこれをうまく行います:

UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];
UIViewController *theTabBar = [secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];
[self.navigationController pushViewController:theTabBar animated:YES];

ただし、注意すべき点の1つは、物事をうまく分離したいということです。ストーリーボードのアイデアは、すべての設計作業を1か所で行いながら、物事を分離しておくことを可能にすることです。各ビューコントローラーは優れており、ストーリーボード内で他のコントローラーから分離されています。全体のアイデアは、すべてを1つの場所に保持することです。整然とレイアウトして整理されるようにしてください。本当に正当な理由がない限り、分離しないでください。


6
ストーリーボードのマージはあまりうまく機能しないため、複数の開発者がいる環境では、個別のストーリーボードを使用するのが面白いかもしれません。また、ストーリーボードが1つしかない大きなプロジェクトでは、パフォーマンスがかなり低下する可能性があります。
calimarkus 2012年

1
私たちは複数のストーリーボードを使用しますが、重要なのは、それを実際に実行してそれらの間でセグメンテーションを行うことができないことです。Appleはすべてを1か所で行えるように設計したので、アイデアは1つだけを使用するようなものです(使用できないわけではありません)。パフォーマンスは問題になりません。ストーリーボードは、ビューコントローラごとに個別のnibファイルにコンパイルされます。ストーリーボードから非常に優れたパフォーマンスが得られるはずです。パフォーマンスは、すべてのビューコントローラーに個別のxibがある場合と同じように優れています。
wbyoung 2012年

3
私の場合、パフォーマンスの問題は通常Xcodeにあります...ストーリーボードエディターのAppleの現在の実装は弱いです。
アダム

1
60シーンのストーリーボードを2014 Mac Proで開くには13秒かかります。レーダーを提出しました。
Robert Atkins

7

UITabBarControllersをUINavigationControllerに配置しないでください。Apple この種の封じ込めをサポートしていないため、不正な自動回転やビューのアンロードなどのバグを求めてます。

ただし、View Controllerを組み合わせる場合は、包含の順序が重要です。特定の取り決めのみが有効です。子から親への包含の順序は次のとおりです。

  • コンテンツビューコントローラー、および柔軟な境界を持つコンテナービューコントローラー(ページビューコントローラーなど)
  • ナビゲーションビューコントローラー
  • タブバーコントローラー
  • 分割ビューコントローラー

1
私は完全に同意しますが、それにはいくつかの理由があります。TabBarControllerをNavigationControllerの内部に配置することはお勧めできません。デリゲートが内部に含まれるビューに対して正しく起動せず、エンドユーザーがインターフェースをナビゲートするのに非常に時間がかかるためです。彼らは、TabBar / Navigationインターフェースをリードするコントローラーに戻るのに苦労するでしょう。逆に言えば、TabBarController内のNavigationControllerです。エンドユーザーを混乱させず、Appleの提案に耳を傾けることは常に最善です。
Hubert

1
それでも、ネイティブのiPhoneミュージックアプリはまさにそれを行います( "Now Playing"の部分)。
Enzo Tran

参考:iPhone音楽アプリの「再生中」画面にはTabbarControllerがありません。
sanjana

4

これは迅速なバージョンです:

let targetStoryboardName = "Main"
let targetStoryboard = UIStoryboard(name: targetStoryboardName, bundle: nil)
if let targetViewController = targetStoryboard.instantiateInitialViewController() {
    self.navigationController?.pushViewController(targetViewController, animated: true)
}

-1

あなたは以下を試しましたか?

2 /クリックして、ナビゲーションコントローラーにリンクされているビューコントローラーを選択し、トップメニューで:エディター->埋め込み->タブバーコントローラー

注:反対を使用しているため、テストしませんでした:タブ付きバーアプリを作成し、ナビゲーションコントローラーを内部に配置します)。

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