単純なクラス LMSVBlocks を作成して、アラートを簡単に表示し、ブロック コールバックを 1 行で取得できるようにしました。この目的に役立つことを願っています
https://github.com/sourabhverma/LMSVBlocks
概念: UIAlertView ブロックに互換性を持たせるには、デリゲート メソッドを処理する別のクラス (LMSVBlockAlert と言う) が必要です。UIAlertView デリゲートがコールバックを提供する場合、LMSVBlockAlert クラスはブロック内でコールバックを送信できます。
コード:
(LMSVBlockAlert.m)
LMSVBlockAlert のすべてのインスタンスを配列に保持して、強い参照を持つようにする
static NSMutableArray *_LMSVblockHandlersArray = nil;
LMSVBlockAlert にブロック ハンドラを保持する
@interface LMSVBlockAlert() <UIAlertViewDelegate>
@property (nonatomic, copy) void (^cancelCompletionBlock)();
@property (nonatomic, copy) void (^confirmCompletionBlock)();
@end
新しいアラートが発生すると、UIAlertView とデリゲート コールバックを持つ LMSVBlockAlert の新しいインスタンスを作成します
+(LMSVBlockAlert*)newInstance{
LMSVBlockAlert *newIns = [[LMSVBlockAlert alloc] init];
[LMSVBlockAlert updateHandlerArrayWith:newIns];
return newIns;
}
LMSVBlockAlert でアラート デリゲートが発生すると、コールバックを送信してブロックし、これをメモリからクリアします。
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
switch (buttonIndex) {
case 0://Cancel
{
if(_cancelCompletionBlock){
_cancelCompletionBlock();
}
}
break;
case 1://OK
{
if(_confirmCompletionBlock){
_confirmCompletionBlock(alertView);
}
}
break;
default:
break;
}
[_LMSVblockHandlersArray removeObject:self];
}
これで、UIAlertView コールバックを提供できる 2 つの単純なメソッドを持つことができます
+(UIAlertView*)promptAlertTwoBtn:(NSString*)msg title:(NSString*)title onCancel:(void (^)())onCancel onConfirm:(void (^)())onConfirm{
return [[LMSVBlockAlert newInstance] showAlertMainWithTitle:title msg:msg onCancel:^{
onCancel();
} onConfirm:^(UIAlertView *alertView) {
onConfirm();
}];
}
-(UIAlertView*)showAlertMainWithTitle:(NSString*)title msg:(NSString*)msg onCancel:(void (^)())onCancel onConfirm:(void (^)(UIAlertView*))onConfirm{
UIAlertView *newAlert = nil;
newAlert = [[UIAlertView alloc]
initWithTitle:title
message:msg
delegate:self
@"Cancel"
otherButtonTitles:@"Confirm", nil];
[newAlert show];
self.cancelCompletionBlock = onCancel;
self.confirmCompletionBlock = onConfirm;
return newAlert;
}
最後に
、お役に立てば幸いです..