вопрос об увольнении UIAlertView - PullRequest
1 голос
/ 10 марта 2011

Я использую UIAlertView с "пожалуйста, подождите" и UIActivityIndicatorView. Я показываю это используя

{
    ...
    [self performSelectorInBackground:@selector(sh) withObject:nil];
    //i've tried also
    //[NSThread detachNewThreadSelector:@selector(showWaiting) toTarget:self withObject:nil];
    ...
}

- (void)showWaiting {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [waitingAlert show];
    [pool drain];
}

Когда появляется предупреждение, экран становится темным и неактивным. И когда приходит время уволить, я делаю

[waitingAlert dismissWithClickedButtonIndex:0 animated:NO];

После того, как это предупреждение исчезает, но иногда (вероятность составляет около 5%) экран остается, как и прежде, затемненным и неактивным. Кто-нибудь сталкивался с такой проблемой? Спасибо!

Ответы [ 3 ]

3 голосов
/ 10 марта 2011

Это не тот ответ, который вы ищете ... но это "правильный" ответ, который в конечном итоге сэкономит вам время:

Вы неправильно используете UIAlertView. Его не следует использовать для индикаторов прогресса и диалогов «Пожалуйста, подождите». Он предназначен для отклонения пользователем нажатием кнопки - UIAlertView никогда не должен просто исчезать сам по себе (исправление: на самом деле, может; API-интерфейс Apple поддерживает его отклонение. Но такая вещь должна использовать очень осторожно.)

Если вы продолжаете злоупотреблять UIAlertView таким образом, не удивляйтесь, когда ваше приложение будет отклонено во время отправки в магазин приложений, а затем вам придется повторить его другим способом.

Пожалуйста, смотрите также мой ответ на этот вопрос:

Несколько AlertViews - Удалить представление оповещения, которое находится за другим предупреждением

1 голос
/ 10 марта 2011

Поскольку скрытые состояния избегают использования UIAlertView, как это,

Я рекомендую MBProgressHUD , он очень прост в использовании, отлично выглядит и предназначен для этой цели.

0 голосов
/ 25 марта 2011

Вы должны создать, показать и выпустить предупреждение за пределами NSAutoreleasePool.Например, вы делаете свой вызов в фоновом режиме:

...
[NSThread detachNewThreadSelector:@selector(showWaiting) toTarget:self withObject:nil];
...

И вызов имеет пул авто-релиза:

- (void)showWaiting {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [self performSelectorInMainThread:@selector(showMyAlert) withObject:nil waitUntilDone:NO];
    //[waitingAlert show];
    [pool drain];
}

Затем вы должны показать предупреждение, используя основной поток.

- (void)showMyAlert {
    UIAlertView * myAlert = [[UIAlertView alloc] initWith...]; 
    [myAlert show];
    [myAlert release];
}

Если вы попытаетесь отобразить предупреждение в пуле автоматического выпуска, и оно будет очищено, то оповещение исчезнет.

Надеюсь, это поможет!

...