Не могу показать MBProgressHUD - PullRequest
0 голосов
/ 01 апреля 2012

В здесь сказано, что использовать MBProgressHUD просто. Но я не могу это сделать.

Вот мой код:

- (IBAction)save{
    HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
    [self.navigationController.view addSubview:HUD];
    HUD.delegate = self;
    [HUD show:YES];

    NSString *title = [page stringByEvaluatingJavaScriptFromString:@"document.title"];
    SavePageAs *savePage = [[SavePageAs alloc] initWithUrl:self.site directory:title];
    [savePage save];
    [HUD hide:YES];
}

Индикатор выполнения не отображается во время запуска метода savePage save, но отображается после полного сохранения страницы (индикатор отображается менее 1 секунды).

Я тоже пробовал так:

- (IBAction)save {

    HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
   [self.navigationController.view addSubview:HUD];

   HUD.delegate = self;
   HUD.labelText = @"Saving...";

   [HUD showWhileExecuting:@selector(performFetchOnMainThread) onTarget:self withObject:nil animated:YES];
}

- (void) savingPage{
    NSString *title = [page stringByEvaluatingJavaScriptFromString:@"document.title"];
    SavePageAs *savePage = [[SavePageAs alloc] initWithUrl:self.site directory:title];
    [savePage save];
}

-(void) performFetchOnMainThread    {
    [self performSelectorOnMainThread:@selector(savingPage) withObject:nil waitUntilDone:YES];
}

Но все равно не повезло. Кто-нибудь, дайте мне знать, где мне здесь не хватает?

P.S: savePage save сохраняет все содержимое сайта в локальном каталоге. Я хотел бы, чтобы после того, как сохранение было завершено, прогресс HUD исчез.

Спасибо

Ответы [ 3 ]

5 голосов
/ 01 апреля 2012

Попробуйте выделить HUD на viewWillAppear: вместо -(IBAction)save, потому что иногда распределение занимает все время, и к тому времени, когда оно выделяет всю задачу, заканчивается.

Скопируйте следующие ссылки на viewWillAppear: и удалите их из -(IBAction)save

 HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
 [self.navigationController.view addSubview:HUD];

 HUD.delegate = self;
 HUD.labelText = @"Saving...";

РЕДАКТИРОВАТЬ: Сохраните распределение на viewWillAppear: и измените код, как показано ниже:

- (IBAction)save {
    [NSThread detachNewThreadSelector:@selector(showHUD) withObject:nil];
    [self performSelectorOnMainThread:@selector(savingPage) withObject:nil waitUntilDone:YES];
}

- (void) savingPage{
    NSString *title = [page stringByEvaluatingJavaScriptFromString:@"document.title"];
    SavePageAs *savePage = [[SavePageAs alloc] initWithUrl:self.site directory:title];
    [savePage save];
    [HUD hide:YES];
}

-(void)showHUD {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   [HUD show:YES];
   [pool release];
}

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

Если это тоже не работает, просто измените waitUntilDone:YES на waitUntilDone:NO

Примечание: Согласно Документация Apple

Внимание! Если вы используете автоматический подсчет ссылок (ARC), вы не сможете используйте авто-релизные пулы напрямую. Вместо этого вы используете @autoreleasepool блоки вместо Например, вместо:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init;
// Code benefitting from a local autorelease pool.
[pool release];

вы бы написали:

@autoreleasepool {
    // Code benefitting from a local autorelease pool.
}

@ блоки autoreleasepool более эффективны, чем использование экземпляра NSAutoreleasePool напрямую; Вы также можете использовать их, даже если вы этого не сделаете используйте ARC.

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

2 голосов
/ 01 апреля 2012

проверьте этот код

- (IBAction)save{
        HUD = [[MBProgressHUD alloc] initWithView:self.view];
        HUD.graceTime     = .1;
        HUD.navigationBar = self.navigationController.navigationBar;
        HUD.labelText     = @"Saving";
        HUD.delegate      = self;
        [self.view addSubview:HUD];

         [HUD showWhileExecuting:@selector(savingPage) onTarget:self withObject:nil animated:YES];
    }


    - (void) savingPage{
        NSString *title = [page stringByEvaluatingJavaScriptFromString:@"document.title"];
        SavePageAs *savePage = [[SavePageAs alloc] initWithUrl:self.site directory:title];
        [savePage save];
    }

когда метод сохранения страницы будет завершен, будет вызван делегат MBProgressHUD, поэтому реализуйте этот метод делегата в своем классе, это удалит HUD из вашего представления

 -(void)hudWasHidden
    {
        [HUD removeFromSuperview];
    }
1 голос
/ 01 апреля 2012

Попробуйте изменить строки выделения HUD на

HUD = [MBProgressHUD showHUDAddedTo: self.navigationcontroller.view animated:YES];
HUD.labelText....

И тогда в вашем методе сохранения вы можете получить

[MBProgressHUD hideHUDForView:self.navigationcontroller.view animated:NO];
...