Отключить actionSheet до завершения действия под его кнопкой - PullRequest
1 голос
/ 22 августа 2011

Моя проблема в том, что у меня есть ActionSheet, который исчезает с экрана, только когда действие под этой кнопкой завершено.Моя проблема заключается в том, что я хочу нажать «сохранить» на моем листе действий, затем закрыть лист действий и затем показать какое-то предупреждение, информирующее пользователя, чтобы он дождался завершения сохранения.В настоящее время он работает по-другому: сначала отображается лист действий, затем сохраняется сообщение ПОД листом действий, в конце лист действий удаляется из поля зрения, поэтому пользователь не видит никаких предупреждающих сообщений.

Как закрыть actionSheet раньше, чем xcodeделает это?

Метод под листом ActionButton:

- (IBAction)saveAction:(id)sender
{
UIAlertView *alert;
alert = [[[UIAlertView alloc] initWithTitle:@"Saving photo to library\nPlease Wait..." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil] autorelease];
[alert show];
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
indicator.center = CGPointMake(alert.bounds.size.width / 2, alert.bounds.size.height - 50);
[indicator startAnimating];
[alert addSubview:indicator];
[indicator release];

[self saveImageToCameraRoll];

[alert dismissWithClickedButtonIndex:0 animated:YES];
}

1 Ответ

2 голосов
/ 22 августа 2011

Вы должны переместить ваш метод saveImageToCameraRoll в отдельный поток или, по крайней мере, асинхронно в основном потоке. Затем вы можете отклонить предупреждение и saveAction: может вернуться до его завершения.

Самый простой способ сделать это - использовать dispatch_async. Используйте dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), чтобы получить очередь для отдельного потока, или dispatch_get_main_queue() для основного потока. Убедитесь, что вы не выполняете никакой работы с пользовательским интерфейсом (или не используете API-интерфейсы, не поддерживающие потоки) в других потоках!


Редактировать: подробнее:

- (IBAction)saveAction:(id)sender {
    UIAlertView *alert;
    alert = [[[UIAlertView alloc] initWithTitle:@"Saving photo to library\nPlease Wait..." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil] autorelease];
    [alert show];
    UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    indicator.center = CGPointMake(alert.bounds.size.width / 2, alert.bounds.size.height - 50);
    [indicator startAnimating];
    [alert addSubview:indicator];
    [indicator release];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // Save in the background
        [self saveImageToCameraRoll];
        dispatch_async(dispatch_get_main_queue(), ^{
            // Perform UI functions on the main thread!
            [alert dismissWithClickedButtonIndex:0 animated:YES];
        });
    });
}
...