Не могу увидеть мой alertView, пока я не закомментирую автоматическое отключение - PullRequest
1 голос
/ 29 ноября 2011

Я реализую простое представление предупреждений с индикатором активности, которое отображается пользователю, пока приложение выполняет восстановление базы данных. Все в порядке, за исключением того, что я не вижу вид предупреждения, если я не закомментирую строку автоматического закрытия (последняя здесь).

Хорошо, восстановление базы данных происходит довольно быстро, но все же я ожидаю увидеть его, даже если на мгновение, нет? Я вижу, что экран становится немного темнее во время анимации, но это все. Я также попытался установить цикл for, чтобы продлить время, время увеличивается, но все еще не отображается предупреждение.

Нет ничего плохого в том, как вызывается представление оповещения, поскольку, если я прокомментирую отклонение, я смогу увидеть его ... только навсегда. У кого-нибудь есть идея здесь?

Прежде чем кто-либо это скажет, я попытался изменить делегат alertView на self, как указано здесь , но это не помогло.

// First we prepare the activity indicator view to show progress indicator
UIActivityIndicatorView * activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

[activityView setFrame:CGRectMake(121.0f, 50.0f, 37.0f, 37.0f)];
[activityView startAnimating];

// Then we put it in an alert view
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Loading" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:nil];
[alertView addSubview:activityView];
[alertView show];

// Finally we operate the restore
[[SQLManager sharedSQL] restoreDatabase:[restoreDatabaseURL path]];

// And we can dismiss the alert view with the progress indicator
[alertView dismissWithClickedButtonIndex:0 animated:NO];

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

Я не уверен , почему это происходит, но я также иногда сталкиваюсь с этим. Один из способов заставить работать что-то подобное - использовать performSelector:withObject:afterDelay: при следующем вызове, например:

// First we prepare the activity indicator view to show progress indicator
UIActivityIndicatorView * activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

[activityView setFrame:CGRectMake(121.0f, 50.0f, 37.0f, 37.0f)];
[activityView startAnimating];

// Then we put it in an alert view
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Loading" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:nil];
[alertView addSubview:activityView];
[alertView show];

// Finally we operate the restore
// [[SQLManager sharedSQL] restoreDatabase:[restoreDatabaseURL path]];
[[SQLManager sharedSQL] performSelector:@selector(restoreDatabase:) withObject:[restoreDatabaseURL path] afterDelay:0.25];


// And we can dismiss the alert view with the progress indicator
[alertView dismissWithClickedButtonIndex:0 animated:NO];

performSelector Документация

1 голос
/ 29 ноября 2011

Звучит так, как будто он распускается почти мгновенно. Если вы добавите цикл for, он, скорее всего, заморозит все остальные вычисления, что означает, что ваше представление активности не будет отображаться до тех пор, пока цикл не прекратится.

Вы можете попробовать использовать NSTimer для вызова другой функции, чтобы определить, завершено ли восстановление или нет;

// Setup our the timer
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                                  target:self 
                                                selector:@selector(checkRestore)
                                                userInfo:nil
                                                 repeats:YES];


// Timer function checking for completion
-(void)checkRestore {
    if (restore is complete) {
        [alertView dismissWithClickedButtonIndex:0 animated:NO];
    }
}
...