UIAlertView не отображается при изменении других представлений - PullRequest
0 голосов
/ 29 декабря 2011

То, что я хочу, чтобы происходило по порядку: всплывающее окно оповещения говорит, что обработка (без кнопок), основная функция обработки вызывается, когда завершается окно оповещения, исчезает, и затем мой контроллер навигации переходит к следующему представлению в серия.

Что на самом деле происходит: окно останавливается во время обработки приложения, затем окно оповещения отображается и мгновенно исчезает, когда контроллер навигации переключается на следующий вид.

Лучшее предложение о том, как это исправить?

Код: [_navigationController dismissModalViewControllerAnimated: NO]; // Камера отклоняет UIAlertView * alert;

alert = [[[UIAlertView alloc] initWithTitle:@"Analyzing\nPlease Wait..." message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles: nil] autorelease];
[alert show];

[self processImage];

[alert dismissWithClickedButtonIndex:0 animated:YES];
[self gotoResults];

Ответы [ 2 ]

2 голосов
/ 29 декабря 2011
alert = [[[UIAlertView alloc] initWithTitle:@"Analyzing\nPlease Wait..." message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles: nil] autorelease];
[alert show];

При вызове [alert show] событие пользовательского интерфейса помещается в основной цикл выполнения. Вы можете обрабатывать другие задачи в другой функции. Например, функция с именем foo обрабатывает другие задачи. И после вызова [alert show] мы вызываем [self performSelector:@selector(foo) withObject:nil afterDelay:0.1], чтобы вызвать foo. Это даст циклу выполнения некоторое время для обработки отображаемого события представления предупреждения.

- (void)foo {
  UIAlert *alert = ... ///< come from above 
  [self processImage];

  [alert dismissWithClickedButtonIndex:0 animated:YES];
  [self gotoResults];
}

Edit: Вы можете прочитать о -performSelector: withObject: afterDelay: в этом официальном документе Apple . Вы можете назначить 0.0 в качестве параметра для afterDelay, и в документе сказано:

delay


Минимальное время, до которого отправляется сообщение. Указание задержка 0 не обязательно приводит к выполнению селектора немедленно. Селектор все еще находится в очереди в цикле выполнения потока и выполняется как можно скорее.
1 голос
/ 29 декабря 2011

[self processImage] работает в главном потоке, что приводит к зависанию окна ... так что вы можете использовать

[NSThread detachNewThread: .....]

для вызова метода AlertView

...