あるストーリーボードから別のストーリーボードに分離すること、またはストーリーボードを別のストーリーボードのView Controllerに埋め込むことは可能ですか? UITabBarController
にUINavigationController
を配置する必要がありますが、ニースと分離した状態に保ちたいと思います。
はい。ただし、プログラムで行う必要があります。
// 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];
UIStoryboardSegueは抽象クラスであるため、実際に手動でセグエを実行することはできません。それをサブクラス化し、perform
を実装して、何でもできるようにする必要があります。本当にストーリーボードで作成することを意図しています。ただし、View Controllerを手動でプッシュすることはできますが、これは良い解決策です。 lnafzigerの答えはこれをうまくやっています:
UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];
UIViewController *theTabBar = [secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];
[self.navigationController pushViewController:theTabBar animated:YES];
ただし、注意すべきことの1つは、物事を素敵で分離したいということです。ストーリーボードのアイデアは、すべてのデザイン作業を1か所で行いながら、物事を分離できるようにすることです。各View Controllerはニースであり、ストーリーボード内で他のコントローラーと分離されています。全体のアイデアは、すべてを1か所に保管することです。整理しやすいようにうまくレイアウトすれば、準備完了です。本当に正当な理由がない限り、分離しないでください。
UITabBarControllersをUINavigationControllerに配置しないでください。 Apple サポートしない このような封じ込めとして、不正な自動回転/ビューのアンロードなどのバグを求めています。
ただし、View Controllerを組み合わせる場合、格納の順序が重要です。特定の取り決めのみが有効です。子から親への封じ込めの順序は次のとおりです。
- コンテンツビューコントローラー、および柔軟な境界を持つコンテナービューコントローラー(ページビューコントローラーなど)
- Navigation View Controller
- Tab Bar Controller
- Split View Controller
Swiftバージョンは次のとおりです。
let targetStoryboardName = "Main"
let targetStoryboard = UIStoryboard(name: targetStoryboardName, bundle: nil)
if let targetViewController = targetStoryboard.instantiateInitialViewController() {
self.navigationController?.pushViewController(targetViewController, animated: true)
}