Индикатор активности не отображается с SVProgressHUD

Я пытаюсь реализовать индикатор активности прогресса SVProgressHUD. Я скопировал класс из [демо]. 1

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

Вот код:

#import "SVProgressHUD.h"

@implementation QuotesAppDelegate

- (void)startLoading 
{
    //call this in your app delegate instead of setting window.rootViewController to your main view controller
    //you can show a UIActivityIndiocatorView here or something if you like
    [SVProgressHUD show];
    [self performSelectorInBackground:@selector(loadInBackground) withObject:nil];
}

- (void)loadInBackground
{ 
    //do your loading here
    //this is in the background, so don't try to access any UI elements
    [self populateFromDatabase];

    [SVProgressHUD dismiss];

    [self performSelectorOnMainThread:@selector(finishedLoading) withObject:nil waitUntilDone:NO];
}

- (void)finishedLoading
{
    //back on the main thread now, it's safe to show your view controller
    [window addSubview:[navigationController view]];
    [window makeKeyAndVisible];
}


- (void)applicationDidFinishLaunching:(UIApplication *)application {

    [self copyDatabaseIfNeeded];

    [self startLoading];
}

4 ответа

Решение

Прежде всего, вы не добавляли SVProgressHUD в представление.

Если ваш класс унаследован от UIViewController, тогда [self.view addSubview:]; или если ваш класс простой UIView то [self addSubView:];

Я не понимаю ваших требований, но насколько я могу понять из вашего кода, который вы показываете [SVProgressHUD show]; в вашем методе startLoading, а затем вы вызываете метод loadInBackground в этом методе, где вы скрываете свой hud, используя [SVProgressHUD dismiss];

Я предлагаю вам проследить это с помощью точки останова и выяснить это.

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

Чтобы решить эту проблему вам нужно это:

- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg

В основном ваш код будет выглядеть примерно так:

- (IBAction)submitPost:(id)sender {
    //now we show the loading bar and submit the comment
    [SVProgressHUD showWithStatus:@"Submitting post" maskType:SVProgressHUDMaskTypeGradient];
    SEL aSelector = @selector(submitDataOfPost);
    [self performSelectorInBackground:aSelector withObject:sender];
}

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

=>

(IBAction)fetchData:(id)sender 
    {    

            [SVProgressHUD showWithStatus:@"Loading..." maskType:SVProgressHUDMaskTypeGradient];
            [self performSelectorOnMainThread:@selector(getDataFromSomeWhere) withObject:nil waitUntilDone:NO];
        }

=>

(void)getDataFromSomeWhere
{

      //Do your data populating here. and dismiss the ProgressHud.
     [SVProgressHUD dismiss];

}

У меня такая же проблема. Когда я изменил версию SVProgressHUD на более позднюю, проблема исчезла. Моя текущая версия поддерживает ARC.

Другие вопросы по тегам