0

MyAlertView (UIAlertView のサブクラス) には次のメソッドがあります。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (self.clickedButtonAtIndexBlock != NULL)
        self.clickedButtonAtIndexBlock(buttonIndex);
}

私の質問は、アラート ビューを作成するときにコールバックをどのように定義すればよいですか? 明らかにこれは間違っています:

alert.clickedButtonAtIndexBlock = ^{
    NSLog(@"clicked: %d", buttonIndex);
}
4

7 に答える 7

3

アラート ビュー、アクション シート、およびアニメーションにブロック コールバックを追加する方法 (およびその理由) についてのブログ記事を書きました。

http://blog.innovattic.com/uikitblocks/

これの実用的な実装が必要な場合は、GitHub からソース ファイルをダウンロードできます。

https://github.com/Innovattic/UIKit-Blocks

使用法:

UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"My easy alert"  
                                                message:@"Would you like to perform some kind of action?"
                                      cancelButtonTitle:@"No"
                                      otherButtonTitles:@"Yes", nil];
[alert setHandler:^(UIAlertView* alert, NSInteger buttonIndex) {
    NSLog(@"Perform some kind of action");
} forButtonAtIndex:[alert firstOtherButtonIndex]];
[alert show];
于 2014-02-26T13:54:49.120 に答える
2

このようなことを試してみてください(私はテストしていません):

.h
typedef void (^MyClickedIndexBlock)(NSInteger index);

@interface YouInterface : YourSuperclass
@property (nonatomic, strong) MyClickedIndexBlock clickedIndexBlock;
@end

.m
//where you have to call the block
if (self.clickedIndexBlock != nil)
    self.clickedIndexBlock(buttonIndex);

// where you want to receive the callback
alert.clickedIndexBlock = ^(NSInteger index){
    NSLog(@"%d", index);
};
于 2012-12-28T01:42:06.613 に答える
1

これを確認してくださいOpinionzAlertViewいくつかのプロジェクトで使用しましたが、うまく機能します。ここにサンプルがあります:

OpinionzAlertView *alert = [[OpinionzAlertView alloc] initWithTitle:@"title"
                                                            message:@"message"
                                                  cancelButtonTitle:@"No, thanks"
                                                  otherButtonTitles:@[@"Done"]
                                            usingBlockWhenTapButton:^(OpinionzAlertView *alertView, NSInteger buttonIndex) {

                                                NSLog(@"buttonIndex: %li", (long)buttonIndex);
                                                NSLog(@"buttonTitle: %@", [alertView buttonTitleAtIndex:buttonIndex]);
                                            }];
[alert show];

お役に立てば幸いです。

于 2015-09-25T13:12:05.357 に答える
0

これを試してみてください

MyCustomAlert というクラスを作成し、それをこの変数として宣言したとします。

MyCustomAlert *myCustomAlert = [[MyCustomAlent alloc] init];

これをヘッダーファイルに入れます。

- (void)setCompletion:(void (^)(int selectedButtonIndex))completion;

そして、これを実装ファイルに入れます

typedef void (^IntBlock)(int intBlock);
IntBlock _completion;

- (void)setCompletion:(void (^)(int selectedButtonIndex))completion{
    _completion = completion;
}

「myCustomAlert」を宣言したプロジェクトに移動しました。入力すると

[myCustomAlert setCompletion: // And select the autocomplete item

あなたはこれで終わるでしょう

[myCustomAlert setCompletion:<#^(int intBlock)completion#>]

値 <#^(int intBlock)completion#> は、このようなバブルとして表示されます。

ここに画像の説明を入力

値に対して Enter キーを押すと、使用するブロックが入力されます。

[myCustomAlert setCompletion:^(int selectedButtonIndex) {

}

カスタム クラスで _completion ブロックをトリガーする場合は、次のようにコードのどこかで呼び出します。

- (void) callCompletionWithButtonIndex:(int) index{
    if (_completion != nil) _completion(index);
}

複雑さが解消されることを願っています。

于 2012-12-28T01:48:55.633 に答える
0

単純なクラス 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;
}

最後に 、お役に立てば幸いです..

于 2014-01-11T23:17:08.993 に答える
0

これらのカテゴリ クラスは、github から簡単に使用できます。

Alert_ActionSheetWithBlocks

これにより、AlertView とアクション シートの両方に Dismiss ブロックが提供されます。

例えば。

UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"AlertView+Block" message:@"WithBlocks" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"newAlertViewWithTextFields",@"newAlertViewWithSingleTextField", nil];
[alert showWithFinishBlock:^(UIAlertView *alertView, NSInteger buttonIndex) 
{ if (buttonIndex == 0) { } else if (buttonIndex == 1) { } }];

これとは別に、テキスト フィールドのメソッドも提供しています。

-(void) showWithFinishBlock:(FinishBlock_)block_; //-- AlertView with TextField [simple or secure]

-(void) showWithTextFieldBlock:(TextFieldBlock_)block_ secure:(BOOL)isSecure; //-- AlertView with two textfields username & password

バンドルされている例を見ることができます。お役に立てば幸いです。

于 2014-01-26T04:18:25.137 に答える