面倒なデリゲート処理を Blocks で記述できるカテゴリ
たとえば,
- プロトコルへの準拠を宣言する
- delegate プロパティに値をセット
- 表示処理を実装
- デリゲートメソッドを実装
書き出してみるとこれだけのことではあるのですが,
感じるところは皆同じらしく,
たとえば UIKitCategoryAdditions というカテゴリを使用すると,
- 表示処理を実装
これだけになります。表示処理自体もオブジェクトの生成や表示メソッドのコールをラップしてくれているので,
[UIActionSheet actionSheetWithTitle:@"Sample"
message:@"Hello World"
destructiveButtonTitle:@"Cancel"
buttons:[NSArray arrayWithObjects:@"First", @"Second", nil]
showInView:self.view
onDismiss:^(int buttonIndex) {
// キャンセル以外のボタンが押された場合の処理
NSLog(@"%d", buttonIndex);
}
onCancel:^ {
// キャンセルボタンが押された場合の処理
NSLog(@"Cancelled");
}];
また,
この一連のフローを実装するとそこそこのステップ数になりますが,
[UIActionSheet photoPickerWithTitle:@"Choose an image"
showInView:self.view
presentVC:self
onPhotoPicked:^(UIImage* image) {
// 画像が選択された場合の処理
NSLog(@"%@", image);
}
onCancel:^ {
// キャンセルされた場合の処理
NSLog(@"Cancelled");
}];
……と,
static DismissBlock _dismissBlock;
static CancelBlock _cancelBlock;
+ (void) actionSheetWithTitle:(NSString*) title
message:(NSString*) message
destructiveButtonTitle:(NSString*) destructiveButtonTitle
buttons:(NSArray*) buttonTitles
showInView:(UIView*) view
onDismiss:(DismissBlock) dismissed
onCancel:(CancelBlock) cancelled
{
[_cancelBlock release];
_cancelBlock = [cancelled copy];
[_dismissBlock release];
_dismissBlock = [dismissed copy];
// 後略
このようにstatic変数にBlockをcopyして保持しており,
インスタンス変数に保持するようにした場合,
このUIKitCategoryAdditionsだけでなく,
そして,
Block内でそのBlockを保持するオブジェクト自身を強参照すると,
id __weak hoge = self;
上で紹介したUIKitCategoryAdditionsにも,
有名なOSSなので利用者も多く,
日本語での解説記事もいくつかあるので本連載では解説は省略しますが,
英単語の単数形/ 複数形変換をメソッド1つで行えるようにするNSStringのカテゴリ
iOSアプリを英語ローカライズする際,
それら諸々のルールをプロパティリストファイルに記述し,
- (NSString *)pluralizeString;
- (NSString *)singularizeString;
このように非常にシンプルなメソッドで単数/複数変換を行えるようにしたカテゴリがActiveSupportInflectorです。
ダウンロード先は下記になります
使用にあたってはNSString+ActiveSupportInflectorクラス以外に,
ちなみに,
//#import "NSString+MSAdditions.h"
このNSString+MSAdditions.
このカテゴリによってどんな変換ができるようになるかは,
("search", "searches"),
("stack", "stacks"),
("fish", "fish"),
("category", "categories"),
("ability", "abilities"),
("agency", "agencies"),
("index", "indices"),
("wife", "wives"),
("safe", "saves"),
("half", "halves"),
("person", "people"),
("man", "men"),
("woman", "women"),
("basis", "bases"),
まとめ
UIImageに各種画像処理機能を持たせるNYXImagesKit,
今回は記事の都合上3つしか紹介できませんでしたが,