jAc*_*OdE 8 iphone xcode cocoa-touch ios
我有一个显示带有YES/NO按钮的UIAlertView的函数,它只在函数范围内使用,因此我不想实现委托以捕获用户反馈.
有没有办法知道用户点击的按钮没有实现UIAlertViewDelegate,如:
[alert show];
if([alert indexOfClickedButton] == indexOfYes)
{
....
}
Run Code Online (Sandbox Code Playgroud)
或者像动画中的lambda表达式
Ark*_*kku 23
没有办法完全避免委托,但你可以沿着这些方向创建一个包装器:
@interface MyAlertViewDelegate : NSObject<UIAlertViewDelegate>
typedef void (^AlertViewCompletionBlock)(NSInteger buttonIndex);
@property (strong,nonatomic) AlertViewCompletionBlock callback;
+ (void)showAlertView:(UIAlertView *)alertView withCallback:(AlertViewCompletionBlock)callback;
@end
@implementation MyAlertViewDelegate
@synthesize callback;
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
callback(buttonIndex);
}
+ (void)showAlertView:(UIAlertView *)alertView
withCallback:(AlertViewCompletionBlock)callback {
__block MyAlertViewDelegate *delegate = [[MyAlertViewDelegate alloc] init];
alertView.delegate = delegate;
delegate.callback = ^(NSInteger buttonIndex) {
callback(buttonIndex);
alertView.delegate = nil;
delegate = nil;
};
[alertView show];
}
@end
Run Code Online (Sandbox Code Playgroud)
(假设ARC,如果您不使用它,则更delegate = nil改为[delegate release].)
用法如下:
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Confirm" message:@"Yes or No?" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:@"Yes",@"No", nil];
[MyAlertViewDelegate showAlertView:alert withCallback:^(NSInteger buttonIndex) {
// code to take action depending on the value of buttonIndex
}];
Run Code Online (Sandbox Code Playgroud)