由于我创建了一个基于块的UIAlertView
and版本UIActionSheet
,我个人再也不会使用基于委托的 Apple 版本。您可以在我的 GitHub 存储库
中下载我的OHActionSheet
和OHAlertView
类。
因为它们基于completionBlock模式,所以它们更具可读性(所有代码都在同一个地方,多个没有共同的委托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
using aswitch/case
或使用 my ObjcSwitch
category,这将允许您编写类似switch/case
代码但 for 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
];
编辑:现在最新的 LLVM 编译器支持新的“Object Literals”语法,您可以像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 */
})();