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