Не могу закрыть UIAlertView, кнопки не нажимаются

У меня есть следующий код, в котором я показываю представление MBProgress, а затем запускаю код в отдельном потоке. Затем я получаю дескриптор основного потока и отключаю счетчик, который работает, а затем показываю UIAlertView. UIAlertView загружается нормально, но я не могу нажать ни одну из кнопок. Если представление предупреждений находится за пределами блока отправки, оно работает нормально. Любые идеи?

[MBProgressHUD showHUDAddedTo:self.view animated:YES];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{

    // Do something...
    GamePlayManager *gameManager = [GamePlayManager alloc];
    Session *sess = [Session sharedInstance];

    //Add the last actor to the end of the list
    NSMutableDictionary *connections = sess.connections;

    [connections setObject:sess.secondActor forKey:[NSString stringWithFormat:@"%d",kLastFieldtag]];

    BOOL result = [gameManager areAnswersCorrect:sess.connections startingActor:sess.firstActor endingActor:sess.secondActor];
    NSString *display = @"Sorry incorrect. Please recheck your answers.";

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Result"
                                                    message:display
                                                   delegate:self
                                          cancelButtonTitle:@"Cancel"
                                          otherButtonTitles:@"OK", nil];

    if (result)
    {
        display = @"You are correct! You Won!";

        if (sess.isMutiplayerGame)
        {
            [_gameCenterController endGame];

            [self showGameOverScreen:YES isMultiplayer:YES];
        } 
        else
        {                
            [self showGameOverScreen:YES isMultiplayer:NO];
        }

        dispatch_async(dispatch_get_main_queue(), ^{
            [MBProgressHUD hideHUDForView:self.view animated:YES];

            [alert show];
        });

    } 
    else 
    {
        dispatch_async(dispatch_get_main_queue(), ^{
            [MBProgressHUD hideHUDForView:self.view animated:YES];

            [alert show];
        });
    }
});

person Scoota P    schedule 15.12.2012    source источник


Ответы (2)


Скорее всего, это проблема, вызванная конфликтом между анимацией MBProgressHUD и UIAlertView.

Я никогда не использовал MBProgressHUD, но, глядя на код на GitHub, кажется, что они уже решили вашу проблему. MBProgressHUD имеет свойство completionBlock.

Такой код должен работать: (Внимание: не проверено)

dispatch_async(dispatch_get_main_queue(), ^{
    [MBProgressHUD HUDForView:self.view].completionBlock = ^{
        [alert show];
    };
    [MBProgressHUD hideHUDForView:self.view animated:YES];
});

MBProgressHUD запускает свой completionBlock после того, как представление закончило свою анимацию, поэтому конфликта больше не должно быть.

Обратите внимание на метод MBProgressHUD:

- (void)showAnimated:(BOOL)animated 
 whileExecutingBlock:(dispatch_block_t)block 
             onQueue:(dispatch_queue_t)queue
     completionBlock:(MBProgressHUDCompletionBlock)completion;

кажется, что это лучше подходит для вашего кода.

person NJones    schedule 15.12.2012

Объявите представление предупреждений вне потоков с помощью блока:

__block UIAlertView *alert;
person Anton    schedule 15.12.2012
comment
Как объявить в Swift - person Kiran Jasvanee; 30.11.2016