UISegmentedControlを使ってUIViewControllerを切り替える方法
公開日:
:
iOSアプリ開発
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

先日紹介した「カスタムコンテナビューコントローラーを作る」の応用例として、UISegmentedControlを使って複数のUIViewControllerを切り替える方法を紹介します。
【iOS】カスタムコンテナビューコントローラーを作る – 拡張現実ライフ
ストーリーボードで親と子のビューコントローラーを用意する

ストーリーボードを使って、こんな感じで親と子のビューコントローラーを配置します。

親となるビューコントローラーには、こんな感じでUISegmentedControlを追加しておきます。UINavigationControllerは、ナビゲーションバーを作るために使っています。

子となる1つ目のビューコントローラー。ここではUITableViewControllerを使っています。また、”Storyboard ID” には “TableViewController” という名前を付けておきます。

子となる2つ目のビューコントローラー。ここではUIViewControllerを使っています。また、”Storyboard ID” には “BlueViewController” という名前を付けておきます。
親のビューコントローラーにコードを追加する
@interface ViewController : UIViewController {
UIViewController *currentViewController_;
NSArray *viewControllers_;
}
@property (weak, nonatomic) IBOutlet UISegmentedControl *segmentedControl;
@end
親となるビューコントローラーの宣言はこんな感じ。子となる複数のビューコントローラーを格納しておく配列 viewControllers_ と、現在表示している子ビューコントローラーを示す currentViewController_ を用意しておきます。
- (void)setupViewControllers
{
UIViewController *firstViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"TableViewController"];
UIViewController *secondViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"BlueViewController"];
viewControllers_ = @[firstViewController, secondViewController];
}
子となるビューコントローラーのオブジェクトを配列に格納するメソッド setupViewControllers。instantiateViewControllerWithIdentifier:メソッドを使って子ビューコントローラーのオブジェクトを生成しています。
- (void)changeSegmentedControlValue
{
if(currentViewController_){
[currentViewController_ willMoveToParentViewController:nil];
[currentViewController_.view removeFromSuperview];
[currentViewController_ removeFromParentViewController];
}
UIViewController *nextViewController = viewControllers_[self.segmentedControl.selectedSegmentIndex];
[self addChildViewController:nextViewController];
nextViewController.view.frame = self.view.bounds;
[self.view addSubview:nextViewController.view];
[nextViewController didMoveToParentViewController:self];
currentViewController_ = nextViewController;
}
UISegmentedControl の selectedSegmentIndex に応じて子ビューコントローラーを入れ替えるメソッド changeSegmentedControlValue を作ります。
- (void)viewDidLoad
{
[super viewDidLoad];
[self setupViewControllers];
[self changeSegmentedControlValue];
}
viewDidLoadメソッドでは、setupViewControllersメソッドを呼んで子ビューコントローラーの配列を作ってから、changeSegmentedControlValueメソッドを呼び出して子ビューコントローラーを表示します。
- (IBAction)changeSegmentValue:(id)sender {
[self changeSegmentedControlValue];
}
UISegmentedControlのアクションでは、単にchangeSegmentedControlValueメソッドを呼び出して子ビューコントローラーを切り替えます。
@akio0911はこう思った。
UISegmentedControlを使ってUIViewControllerを切り替えるのって、結構よく使うパターンじゃないかなと思います。もっと良い方法があったらTwitterなどでぜひ教えてくださいね。




