見出し画像

【Objective−C】モーダルビューを呼び出す(描画する)処理の書き方

こういう人に向けて発信しています。
・下から上に出てくるモーダルビュー表示をやりたい人
・コードでナビゲーションバーを表示する方法も知りたい人
・Objective−C 初心者から中級者向け

コード自体は単純です。

    TableViewController *tableVC = [[TableViewController alloc] init];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:tableVC];
    [self presentViewController:navigationController animated:YES completion:nil];

TableViewControllerが表示させたいクラスですね。
それをナビゲーションバー採用した上でモーダル表示しております。

NavigationControllerも実装した方がいい理由

モーダル表示をするとユーザーは帰って来る事が出来ない、
袋小路状態になってしまうので戻るボタンは実装してあげる必要あり。

なので、今回は冗長かもですが、
NavigationBarItemも含めてコード残していきます。

使うクラスについて(今回はxibファイルは不使用)


(1)ViewController.h
(2)ViewController.m
(3)TableViewController.h
(4)TableViewController.m

ViewController.h

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

ViewController.m

#import "ViewController.h"
#import "TableViewController.h"

@interface ViewController (){
    UIButton *btn;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self initButton];
}

-(void)initButton{
    btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 40.0f,self.view.bounds.size.width, 10.0f)];
    [btn setTitle:@"モーダルビューが展開。" forState:UIControlStateNormal];
    [btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; //有効時
    [btn addTarget:self action:@selector(tappedButton:)
        forControlEvents:UIControlEventTouchDown];
    [self.view addSubview:btn];
}

-(void)tappedButton:(UIButton*)button{
    // ここに何かの処理を記述する
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"モーダルを展開してよろしいですか?" message:nil preferredStyle:UIAlertControllerStyleAlert];
    
    //preferredStyle:UIAlertControllerStyleActionSheet = アクションシート
    //preferredStyle:UIAlertControllerStyleAlert = アラートビュー
    [alertController addAction:[UIAlertAction actionWithTitle:@"はい" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        //yesボタンが押された時の処理
        [self showTableViewController];
    }]];
    [alertController addAction:[UIAlertAction actionWithTitle:@"いいえ" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        // cancelボタンが押された時の処理

    }]];
    
    [self presentViewController:alertController animated:YES completion:nil];

}

- (void)showTableViewController{

    TableViewController *tableVC = [[TableViewController alloc] init];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:tableVC];
    [self presentViewController:navigationController animated:YES completion:nil];
}
@end

TableViewController.h

#import <UIKit/UIKit.h>

@interface TableViewController : UITableViewController
@property (nonatomic) NSMutableArray *cellNameArray;
@end

TableViewController.m

#import "TableViewController.h"

@interface TableViewController ()<UINavigationControllerDelegate>

@end

@implementation TableViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _cellNameArray = [@[@"value1", @"value2", @"value3"] mutableCopy];
    
    [self loadNavigationBarItem];
}

- (void)loadNavigationBarItem{
    self.navigationItem.title = @"TableViewControllerクラス";
    
    UIBarButtonItem *backBtn = [[UIBarButtonItem alloc]
                                initWithTitle:@"閉じる"  // ボタンタイトル名を指定
                                style:UIBarButtonItemStylePlain
                                target:self  // デリゲートのターゲットを指定
                                action:@selector(closeModel)  // ボタンが押されたときに呼ばれるメソッドを指定
                                ];
    self.navigationItem.leftBarButtonItem = backBtn;
}

- (void)closeModel{
    [self dismissViewControllerAnimated:YES completion:nil];
}

#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return _cellNameArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *cellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    cell.textLabel.text = _cellNameArray[indexPath.row];
    return cell;
}

@end

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