Objective-C

UIAlertController生成を他クラスに切り分ける PART2

More than 1 year has passed since last update.

前回、UIAlertControllerの生成を別クラスに切り分けてみたが、汎用性がなく、クラスに切り分ける意味がなくなってしまっていたので、改めて書いてみる。
今回はデリゲートと合わせて使ってみました。

Alertを生成するクラスの用意

任意のテキスト情報を受け取りControllerの代わりにUIAlertControllerを作ります。
その際に、アラートアクションとしてデリゲートメソッドをセットしています。

AlertHelper.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@protocol AlertHelperDelegate <NSObject>
- (void)reload;
@end

@interface AlertHelper : NSObject
@property (nonatomic, weak) id<AlertHelperDelegate> delegate;
- (UIAlertController *)createAlertController:(NSString *)title
                                     messege:(NSString *)messege;
@end
AlertHelper.m
#import "AlertHelper.h"

@interface AlertHelper ()

@end

@implementation AlertHelper

- (UIAlertController *)createAlertController:(NSString *)title
                                     messege:(NSString *)messege {

    UIAlertController *aleartController = [UIAlertController alertControllerWithTitle:title
                                                                              message:messege
                                                                       preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"キャンセル"
                                                     style:UIAlertActionStyleCancel
                                                   handler:^(UIAlertAction *action) {

                                                       NSLog(@"キャンセルしました。");

                                                   }];

    UIAlertAction *save = [UIAlertAction actionWithTitle:@"保存"
                                                   style:UIAlertActionStyleDefault
                                                 handler:^(UIAlertAction *action) {

                                                     NSLog(@"保存しました。");

                                                     // デリゲートメソッドを呼ぶ
                                                     [self.delegate reload];

                                                 }];

    [aleartController addAction:cancel];
    [aleartController addAction:save];

    return aleartController;
}

@end

Controllerクラスでの受け取りと実行

ボタンアクションをトリガーにアラートを受け取り、表示します。
デリゲートメソッドを使うので、そちらの用意も行います。

ViewController.m
#import "ViewController.h"
#import "AlertHelper.h"

@interface ViewController () <AlertHelperDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

}

// デリゲートメソッド
- (void)reload {

    NSLog(@"保存ボタン押下後、このメソッドが走ります。");

}

- (IBAction)outputAleart:(id)sender {

    AlertHelper *aleartHelper = [AlertHelper new];

    aleartHelper.delegate = self;

    UIAlertController *aleartController = [aleartHelper createAlertController:@"タイトル" messege:@"メッセージ"];

    [self presentViewController:aleartController animated:true completion:nil];
}

@end

まとめ

前回の記事でやった方法よりは汎用性があるかなと思います。
デリゲートと合わせて使うことで、コントローラーから切り出しても不自由なく使えるかなと思います。