見出し画像

【Objective−C】UISegmentedControlで他クラスのViewを貼り付けてみよう(切り替えても1個前の押下状況などを保持)【Xcode10.1】

こういう人に向けて発信しています。
・UISegmentedControlの実装を知りたい人
・セグメントを切り替えても以前のView状況を保持したい人
・Objective−C 初心者〜中級者

UISegmentControllとは

下記のようなオブジェクトの事をセグメント、
セグメントコントロールといいます。

View状況の保持とは

他のクラスのViewを貼り付けて、
そのクラスにあるテーブルビューやボタンやテキストフィールドなどの
状況が毎回セグメントを切り替えるたびに消えていたら不便なので、
今回はそうならないように押下状況などオブジェクトの様子は
保持して表示させています。

具体的にはインスタンスを新たに生成しないで一度表示した
インスタンスは持っておきます。

逆に裏を返せばセグメントを切り替えるたびに、
真っ白な状況で良い場合ならインスタンスは毎回生成してOKです。

今回使うクラスについて

(1)ViewController.h
(2)ViewController.m
(3)MeijiViewController.h
(4)MeijiViewController.m
(5)MeijiViewController.xib
(6)TaishoViewController.h
(7)TaishoViewController.m
(8)TaishoViewController.xib

ちなみに、今回はxibで使ってみましたが、
特にView生成をコーディングで行っていても問題ないです。
xibでview作っていても出来るよってことです。
(動作確認用のoutlet接続不要のボタン1個置くのはxibの方が早い…)
Meiji/taishoクラスは新規追加から何もコーディングしてません。
xibで既存viewのbackGroundColorだけいじってます。

ViewController.h

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end

ViewController.m

#import "ViewController.h"
#import "MeijiViewController.h"
#import "TaishoViewController.h"

@interface ViewController (){
    UISegmentedControl *segment;
    UIView *classView;
    NSArray *segmentArray;
    MeijiViewController *meijiVC;
    TaishoViewController *taishoVC;
    
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    segmentArray = @[@"明治", @"大正"];
    
    [self initSegment];
    [self initView];
    
    //初回読み込み時にセグメントを自動で取得する書き方が分からなかったので、
    //わざわざ記載した。
    [self segmentChanged:(UISegmentedControl *)segment];
 }

-(void)initSegment{
    UISegmentedControl *seg =  [[UISegmentedControl alloc] initWithItems:segmentArray];
    seg.frame = CGRectMake(0, 40.0f, self.view.bounds.size.width, 30);
    seg.segmentedControlStyle = UISegmentedControlStylePlain; //スタイルの設定

    [seg addTarget:self action:@selector(segmentChanged:)
  forControlEvents:UIControlEventValueChanged];
    seg.selectedSegmentIndex = 0; //昭和を選択
    
    [self.view addSubview:seg];
}

-(void)segmentChanged:(UISegmentedControl*)seg{
    
    for(UIView *view in [classView subviews]){
        [view removeFromSuperview];
    }
    switch (seg.selectedSegmentIndex) {
        case 0:
            if(!meijiVC){
                meijiVC = [[MeijiViewController alloc]init];
            }
            [classView addSubview:meijiVC.view];

            
            break;
            
        case 1:
            if(!taishoVC){
                taishoVC = [[TaishoViewController alloc]init];
            }
            [classView addSubview:taishoVC.view];
            break;
            
        default:
            break;
    }
}

-(void)initView {
    CGRect rect = CGRectMake(0, self.view.frame.size.height /6, self.view.frame.size.width,self.view.frame.size.height*5/6);
    classView = [[UIView alloc] initWithFrame:rect];
    [self.view addSubview:classView];
}

@end

Viewオブジェクト状況を残さない場合の書き方

        case 1:
            if(!taishoVC){
                taishoVC = [[TaishoViewController alloc]init];
            }
            [classView addSubview:taishoVC.view];
            break;

例えばこちらのコードですが、
if文でtaishoVCのインスタンスがあるかどうかチェックしていて、
初回しか通っていません(インスタンス生成していません)

なので、if文外して毎回インスタンス生成してView追加すれば、
常に新しいインスタンスのViewが出てくるので、
押下状況はリセットされています。



いいなと思ったら応援しよう!