2012-12-15 6 views
1

У меня есть следующий код, где я показываю представление MBProgress, а затем запускаю код в отдельном потоке. Затем я получаю обращение к основному потоку и увольняю счетчик, который работает, а затем я показываю UIAlertView. 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]; 
     }); 
    } 
}); 

ответ

4

Это, вероятно, проблема вызвана столкновением между «анимации с и UIAlertView» MBProgressHUD анимации s.

Я никогда не использовал 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; 

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

+0

удивительный, который сработал! –

1

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

__block UIAlertView *alert; 
+0

Как объявить в Swift – KiranJasvanee