0

問題は、2 つのアラートを作成して表示すると、2 番目のアラートが最初のアラートを上書きし、閉じた後に最初に表示されることです。とてもきれいではありません。

NSOperationQueue でキュー アラートを作成しようとしています。いくつかのアラートを追加すると、クローズするシーケンスが表示されます。しかし、私はそうすることができないので、前のものを待って、順次実行される操作を追加することになります。それらは並行して実行されます。

AlertOperation.h

#import <Foundation/Foundation.h>

@interface AlertOperation : NSOperation<UIAlertViewDelegate>

@property (nonatomic,assign) BOOL isFinishedAlert;

- (AlertOperation *)initWithAlert:(UIAlertView *)alert;

@end

AlertOperation.m

#import "AlertOperation.h"

@interface AlertOperation()
{
    UIAlertView *_alert;
}

@end

@implementation AlertOperation

@synthesize isFinishedAlert     = _isFinishedAlert;

- (AlertOperation *)initWithAlert:(UIAlertView *)alert
{
    self = [super init];

    if (self)
    {
        _alert = alert;
        _alert.delegate = self;
        [_alert show];
    }

    return self;
}

- (void) main
{
    _isFinishedAlert = NO;

    do {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    } while (!_isFinishedAlert);
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    _isFinishedAlert = YES;
}

- (BOOL) isConcurrent
{
    return NO;
}
@end

ここに実行コードがあります

UIAlertView *u1 = [[UIAlertView alloc] initWithTitle:@"" 
message:@"Hello i am first alert" delegate:nil 
cancelButtonTitle:@"OK" otherButtonTitles:nil];

UIAlertView *u2 = [[UIAlertView alloc] initWithTitle:@"" 
message:@"Hello i am second alert" delegate:nil 
cancelButtonTitle:@"OK" otherButtonTitles:nil];

NSOperation *alertOp1 = [[AlertOperation alloc] initWithAlert:u1];
NSOperation *alertOp2 = [[AlertOperation alloc] initWithAlert:u2];

alertsQueue = [[NSOperationQueue alloc] init];
[alertsQueue setMaxConcurrentOperationCount:1];

[alertsQueue addOperation:alertOp1];
[alertsQueue addOperation:alertOp2];
4

2 に答える 2

0

[_alert show] を -(void)main メソッドに移動したところ、うまくいきました! @phix23、助けてくれてありがとう!

于 2012-09-08T20:14:34.787 に答える
0

これを自分で簡単にしてください。可変配列を作成します。表示する新しいアラートがある場合は、それらをアレイにプッシュします。アラートが終了する (デリゲート メッセージを取得する) たびに、次のアラートをメイン キューにディスパッチします。

NSMutableArray *alerts;

... end of Alert Delegate message
if([alert count]) {
  UIAlert *alrt = [alerts objectAtIndex:0];
  [alerts removeObjectAtIndex:0];
  dispatch_async(dispatch_get_main_queue(), ^{ [alrt show]; } );
}
于 2012-09-05T17:46:10.717 に答える