読者です 読者をやめる 読者になる 読者になる

UISegmentControllで画面を切り替える方法

やりたいこと

本来の用途と違うのかもしれませんが、Segment Controlを切り替えるタイミングで別のViewControllerを呼び出すというもの。
Viewを配置しておいて、Segment ControlをかえるとViewの中身だけ変わるような画面のイメージです。

実装

1. SegmentControlを追加する

まずは、Main.StoryBoardにSegmentControlとViewを追加する
f:id:yoppy0066:20150324013449p:plain

こんな感じで、グレーの部分がViewです。

2. UIViewControllerを追加する

SegmentControlを切り替えた時に表示するViewContollerをそれぞれ作成します。xivファイルも同時に作成します
ここでは、それぞれFirstViewController、SecondViewControllerとします。

3. ViewController.h(呼び出し元)を編集する

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController {
    NSArray *viewControllers;
    UIViewController * currentViewController;
}

@property (weak, nonatomic) IBOutlet UIView *view;
@property (weak, nonatomic) IBOutlet UISegmentedControl *segment;
@end

viewとsegmentはStoryBoardからドラックアンドドロップしたもので、StoryBoardとソースコードを結びつけています

4. ViewController.m(呼び出し元)を編集する

ViewController.m

#import "ViewController.h"
#import "FirstViewController.h" //追加
#import "SecondViewController.h" //追加

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    [self setUpViewControllers];
    [self.segment addTarget:self action:@selector(segmentChanged) forControlEvents:UIControlEventValueChanged];
    self.navigationItem.titleView = self.segment;
    self.segment.selectedSegmentIndex = 0;
    [self segmentChanged];
    [self.view addSubview:self.segment];
}

- (void) segmentChanged {
    if(currentViewController) {
        [currentViewController.view removeFromSuperview];
    }
    UIViewController *vc = [viewControllers objectAtIndex:self.segment.selectedSegmentIndex];
    [self.myView addSubview:vc.view];
    
    [vc didMoveToParentViewController:self];
    [currentViewController removeFromParentViewController];
    currentViewController = vc;
}

- (void)setUpViewControllers{
    FirstViewController *firstViewController = [[FirstViewController alloc]initWithNibName:@"FirstViewController" bundle:nil];
    SecondViewController *secondViewController = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
    viewControllers = [NSArray arrayWithObjects:firstViewController,secondViewController,nil];
}

こんなかんじで簡単に実装できました。

さいごに

まだあんまりわかってないんですけど、ファイルを分けることで見通しがよくなることと、後でうまくやれば再利用できるかもしれないというメリットもあるのかなぁとおもいます。

以上です