1

ユーザーがアプリケーションを初めて開いたときにのみ2つのアラートビューを表示したいのですが、2番目のビューは最初のビューが閉じられた後に表示されます。UIAlertViewsが以前に表示されていない場合にのみ表示されるように設定しましたが、これについてはサポートが必要ありません。この場合、2つのアラートビューを連続して表示する方法を理解するのに助けが必要です。

-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndexが機能しません。

これが私が持っているコードです-これはdidFinishLaunchingWithOptionsにあることを覚えておいてください:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL didFirstLaunch = [defaults boolForKey:@"DidFirstLaunch"];
if (!didFirstLaunch) {
    [defaults setBool:YES forKey:@"DidFirstLaunch"];

    UIAlertView *successAlert = //not important
    [successAlert show];
    [successAlert release];

    //Somehow show second alert after the first is dismissed
}
4

3 に答える 3

4

GCD&blocksを使用して非常に単純なソリューションを投稿します( GCD の部分は、別のスレッドでアラート ビューが作成され、次にメイン スレッドで作成された場合に備えて、メイン スレッドでコールバックを安全に実行する必要があります)。覚えておいてください、私はこれを 5 分ほどでコーディングしたので、間違いなくコードの改善に取り組む必要があります。少し醜いことの 1 つは、サブクラスでオーバーライドされるデリゲート パラメーターです。サブクラスのインターフェースを少し変更して、何が起こるかをより明確にすることができます...

とにかく、ここに行く...

最初に のサブクラスを作成しUIAlertView、次のようにします...

@interface FSAlertView () <UIAlertViewDelegate>

@property (nonatomic, copy) void (^dismissHandler)(NSInteger buttonIndex);

@end


@implementation FSAlertView

@synthesize dismissHandler = _dismissHandler;

- (void)showWithDismissHandler:(void (^)(NSInteger buttonIndex))dismissHandler
{
    self.dismissHandler = dismissHandler;

    self.delegate = self;

    [self show];
}

// Alert view delegate

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    dispatch_async(dispatch_get_main_queue(), ^ {

        if (_dismissHandler)
        {
            _dismissHandler(buttonIndex);
        }

    });
}

アプリでは、次のようなアラート ビューを作成できます ...

FSAlertView *alert1 = [[FSAlertView alloc] initWithTitle:@"Alert 1"
                                                 message:@"Some message"
                                                delegate:nil
                                       cancelButtonTitle:@"Cancel"
                                       otherButtonTitles:@"Show 2nd Alert", nil];

[alert1 showWithDismissHandler:^ (NSInteger buttonIndex) {

    NSLog(@"button pressed: %d", buttonIndex);

    if (buttonIndex == 1)
    {
        UIAlertView *alert2 = [[UIAlertView alloc] initWithTitle:@"Alert 2"
                                                         message:@"Hi!"
                                                        delegate:nil
                                               cancelButtonTitle:@"OK"
                                               otherButtonTitles:nil];
        [alert2 show];
    }

}];
于 2012-07-31T12:30:49.087 に答える
1

あなたの質問を正しく理解していれば、これが役立つかもしれません:

 UIAlertView *firstAlert = [[UIAlertView alloc] initWithTitle:@"Alert 1" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];
    [firstAlert show];
    [self performSelector:@selector(test:) withObject:firstAlert afterDelay:2];
    [firstAlert release];

    UIAlertView *secondAlert = [[UIAlertView alloc] initWithTitle:@"Alert 2" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];
    [secondAlert show];
    [self performSelector:@selector(test:) withObject:secondAlert afterDelay:2];
    [secondAlert release];


-(void)test:(UIAlertView*)alert{
    [alert dismissWithClickedButtonIndex:-1 animated:YES];
}

これにより、2 つのアラート ビューが交互に表示されます。

注: キャンセル ボタンでアラートを閉じているかどうかはわかりません。そのため、数秒後に自動的に閉じています。

于 2012-07-31T12:39:04.530 に答える
0

これを試して:

UIAlertView *firstAlert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
[firstAlert setTag:444];
[firstAlert show];
firstAlert = nil;

AlertViewデリゲートメソッド:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    switch (alertView.tag) {
        case 444:
        {
            //Cancel ButtonIndex = 0
            if (buttonIndex == 1) {
                UIAlertView *secondAlert = [[UIAlertView alloc] initWithTitle:@"Title 2" message:@"Message2" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Dismiss", nil];
                [secondAlert setTag:555];
                [secondAlert show];
                secondAlert = nil;
            } 
        }
        break;
        case 555:
        {
            if (buttonIndex == 1) {
                NSLog(@"Code Here");
            }
        }
        break;
    }
}
于 2012-07-31T13:09:45.667 に答える