と のブロック ベース バージョンを作成したのでUIAlertView
、UIActionSheet
個人的にはデリゲート ベースの Apple バージョンを二度と使用しません。myとclasses は、私の GitHub リポジトリから
ダウンロードできOHActionSheet
OHAlertView
ます。
これらはcompletionBlockパターンに基づいているため、より読みやすく (すべてのコードが同じ場所にあり、 multiple の共通デリゲートがないUIActionSheets
など)、より強力です (ブロックは必要に応じてコンテキストもキャプチャするため)。
NSArray* otherButtons = @[ @"aaa", @"bbb", @"ccc", @"ddd" ];
[OHActionSheet showSheetInView:self.view
title:nil
cancelButtonTitle:@"cancel"
destructiveButtonTitle:@"erase"
otherButtonTitles:otherButtons
completion:^(OHActionSheet* sheet, NSInteger buttonIndex)
{
if (buttonIndex == sheet.cancelButtonIndex) {
// cancel
} else if (buttonIndex == sheet.destructiveButtonIndex) {
// erase
} else {
NSUInteger idx = buttonIndex - sheet.firstOtherButtonIndex;
// Some magic here: thanks to the blocks capturing capability,
// the "otherButtons" array is accessible in the completion block!
NSString* buttonName = otherButtons[idx];
// Do whatever you want with idx and buttonName
}
}];
追記: switch/case
NSStrings の使い方
if/else
完了ハンドラーのテストの otherButtons 部分で、idx
a を使用してテストするかswitch/case
、 my ObjcSwitch
categoryswitch/case
を使用してテストできることに注意してください。これにより、のようなコードを書くことがNSStrings
できますが、あなたOHActionSheet
の完了ハンドラ:
NSUInteger idx = buttonIndex - sheet.firstOtherButtonIndex;
NSString* buttonName = otherButtons[idx];
[buttonName switchCase:
@"aaa", ^{ /* Some code here to execute for the "aaa" button */ },
@"bbb", ^{ /* Some code here to execute for the "bbb" button */ },
@"ccc", ^{ /* Some code here to execute for the "ccc" button */ },
..., nil
];
EDIT : 最新の LLVM コンパイラが新しい「オブジェクト リテラル」構文をサポートするようになったのでObjcSwitch
、NSDictionary のコンパクトな構文を使用するのと同じことができます。
((dispatch_block_t)@{
@"aaa": ^{ /* Some code here to execute for the "aaa" button */ },
@"bbb": ^{ /* Some code here to execute for the "bbb" button */ },
@"ccc": ^{ /* Some code here to execute for the "ccc" button */ },
}[buttonName] ?:^{
/* Some code here to execute for defaults if no case found above */
})();