以下のコードは、コンテナビューでコントローラを切り替える方法を示しています。IBでは、タブ付きのテンプレートから始め、FirstViewControllerの上部にナビゲーションバーとツールバーを追加し、セグメント化されたコントロールをツールバーに追加しました。次に、コンテナビュー(オブジェクトリストの通常のビューの横)をビューに追加し、タブバーとツールバーの間のすべてのスペースを占めるようにサイズを変更しました。コンテナビューとナビゲーションバーのタイトルアイテムへのアウトレットを作成し、メソッドchangeControllers:をセグメント化されたコントロールに接続しました。コンテナビューを追加すると、同じサイズのViewControllerが埋め込みセグエで自動的に接続されます。ビューコントローラーをさらに2つ追加し、サイズを「フリーフォーム」に変更し、サイズを組み込みコントローラー(320x411)と同じになるように調整しました。このサイズ変更は、IBでのレイアウトのみを目的としています。以下に示すように、ビューをコンテナーに追加するときに、コードでビューのサイズを変更する必要があります。このコードは、コンテナービューを持つコントローラーであるFirstViewControllerにあります。
@interface FirstViewController ()
@property (weak,nonatomic) IBOutlet UIView *containerView;
@property (strong,nonatomic) UIViewController *embeddedVC;
@property (strong,nonatomic) UIViewController *secondVC;
@property (strong,nonatomic) UIViewController *thirdVC;
@property (strong,nonatomic) UIViewController *currentController;
@property (weak,nonatomic) IBOutlet UINavigationItem *titleItem;
@end
@implementation FirstViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.embeddedVC = self.childViewControllers.lastObject;
self.currentController = self.embeddedVC;
self.titleItem.title = self.currentController.title;
}
-(IBAction)ChangeControllers:(UISegmentedControl *)sender {
switch (sender.selectedSegmentIndex) {
case 0:{
if (![self.currentController isEqual:self.embeddedVC]) {
self.embeddedVC.view.frame = self.containerView.bounds;
[self addChildViewController:self.embeddedVC];
[self moveToNewController:self.embeddedVC];
}
break;
}
case 1:{
if (! self.secondVC) {
self.secondVC = [self.storyboard instantiateViewControllerWithIdentifier:@"Second"];
}
if (![self.currentController isEqual:self.secondVC]) {
self.secondVC.view.frame = self.containerView.bounds;
[self addChildViewController:self.secondVC];
[self moveToNewController:self.secondVC];
}
break;
}
case 2:{
if (! self.thirdVC) {
self.thirdVC = [self.storyboard instantiateViewControllerWithIdentifier:@"Third"];
}
if (![self.currentController isEqual:self.thirdVC]) {
self.thirdVC.view.frame = self.containerView.bounds;
[self addChildViewController:self.thirdVC];
[self moveToNewController:self.thirdVC];
}
break;
}
default:
break;
}
}
-(void)moveToNewController:(id) newController {
[self.currentController willMoveToParentViewController:nil];
[self transitionFromViewController:self.currentController toViewController:newController duration:.6 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{}
completion:^(BOOL finished) {
[self.currentController removeFromParentViewController];
[newController didMoveToParentViewController:self];
self.currentController = newController;
self.titleItem.title = self.currentController.title;
}];
}