I'm not sure why Apple didn't do this one when adding blocks to everything. A bit of code to do an UIAlertView with passing in a block to handle the button tapped. (It also uses a NSArray rather than a null-terminated list.)
I've not done it yet, but would be simple to do a similar thing with UIActionSheet too.
////////////////////////////////////////////////////////////////
//.H file...
//Helper to store the block
@interface UIAlertViewBlock : UIAlertView
@property (nonatomic, copy) void (^clickBlock)(NSInteger buttonIndex);
@end
@interface UIAlertView (MichaelBurfordBlocks)
+ (void)alertWithTitle:(NSString *)title
message:(NSString *)message
cancelButtonTitle:(NSString *)cancelButtonTitle
otherButtonTitles:(NSArray *)otherButtonTitles
clickedButton:(void (^)(NSInteger buttonIndex))block;
@end
////////////////////////////////////////////////////////////////
//.M file...
@implementation UIAlertViewBlock
- (void)alertView:(UIAlertView *)alertView
clickedButtonAtIndex:(NSInteger)buttonIndex {
self.clickBlock(buttonIndex);
}
- (void)dealloc {
self.clickBlock = nil;
[super dealloc];
}
@end
@implementation UIAlertView (MichaelBurfordBlocks)
+ (void)alertWithTitle:(NSString *)title
message:(NSString *)message
cancelButtonTitle:(NSString *)cancelButtonTitle
otherButtonTitles:(NSArray *)otherButtonTitles
clickedButton:(void (^)(NSInteger buttonIndex))block {
UIAlertViewBlock *alert = [[UIAlertViewBlock alloc]
initWithTitle:title
message:message
delegate:nil
cancelButtonTitle:cancelButtonTitle
otherButtonTitles:nil];
alert.clickBlock = block;
alert.delegate = alert;
for (NSString* otherTitle in otherButtonTitles) {
[alert addButtonWithTitle:otherTitle];
}
[alert show];
[alert autorelease];
}
///////////////////////////////////////////////////////////////
//Then you get to use it like this!
[UIAlertView alertWithTitle:NSLocalizedString(@"Buy My App", nil)
message:NSLocalizedString(@"Please Buy My App", nil)
cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
otherButtonTitles:@[NSLocalizedString(@"Buy Now", nil)]
clickedButton:^(NSInteger buttonIndex) {
if (buttonIndex==1) {
if ([SKPaymentQueue canMakePayments] && buyItem) {
SKPayment *payment = [SKPayment paymentWithProduct:buyItem];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
}
}];
No comments:
Post a Comment