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などでぜひ教えてくださいね。