MBProgressHUD не сбрасывается - PullRequest
0 голосов
/ 14 марта 2012

Я использую MBProgressHUD в нашем учебном приложении, в котором находится панель вкладок.

Пользователь перейдет из табличного представления через витрину магазина Urban Airship непосредственно к подробному представлению UA. Когда нажата покупка, я вывожу HUD с

 HUD = [[MBProgressHUD alloc] initWithWindow:[UIApplication sharedApplication].keyWindow];
 [self.view.window addSubview:HUD];

Используется оператор showWhileExecuting .

Он проходит через три оператора while, чтобы изменить его с «Соединение» на «Загрузка» на «Распаковка». Все работает отлично, хорошо.

Здесь возникает проблема ... Во второй раз, когда я это сделаю, текст метки не изменится. Застрял на "Подключение". Я вижу в NSLog, что он проходит через другие циклы.
Кроме того, если я пытаюсь изменить режим, приложение вылетает.

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

Мне кажется, что MBProgressHUD не сбрасывается после завершения.
(В проекте используется ARC)

Кто-нибудь с решением? Спасибо

Edit:

- (void)showWithLabelDeterminate 
{

    HUD = [[MBProgressHUD alloc] initWithWindow:[UIApplication sharedApplication].keyWindow];
    HUD.mode = MBProgressHUDModeIndeterminate;
    [self.view.window addSubview:HUD];


    HUD.delegate = self;
    HUD.labelText = NSLocalizedString(@"Connecting","");
    HUD.detailsLabelText = @" ";
    HUD.minSize = CGSizeMake(145.f, 145.f);
    HUD.dimBackground = YES;

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


-(void)lessonDownloadProgress
{

    DataManager *sharedManager = [DataManager sharedManager];
    //  HUD.mode = MBProgressHUDModeIndeterminate;
    HUD.labelText = nil;
    HUD.detailsLabelText = nil;

    while ([sharedManager.downHUD floatValue] == 0.0f) 
    { 
        [self parentViewController];
        NSLog(@"HUD lessonDownloadProgress: %f", HUD.progress);
        HUD.labelText = NSLocalizedString(@"Connecting","");
        HUD.detailsLabelText = @" ";
        NSLog(@"Waiting for download to start");
        //  Wait for download to start
        usleep(80000);
    }

    // Switch to determinate mode     
    // HUD.mode = MBProgressHUDModeDeterminate;
    HUD.labelText = NSLocalizedString(@"DownLoading","");
    HUD.progress = [sharedManager.downHUD floatValue];

    while (HUD.progress < 1.0f && [sharedManager.cleanedUp isEqualToString:@"No"])
    {
        //  [self parentViewController];
        HUD.labelText = NSLocalizedString(@"Downloading","");
        NSLog(@"HUD lessonDownloadProgress: %f", HUD.progress);
        HUD.progress = [sharedManager.downHUD floatValue];                       
        NSString *percent = [NSString stringWithFormat:@"%.0f", HUD.progress/1*100];
        HUD.detailsLabelText = [percent stringByAppendingString:@"%"];
        usleep(50000);
    }

    //  Switch HUD while cleanUp
    HUD.mode = MBProgressHUDModeIndeterminate;

    while ([sharedManager.cleanedUp isEqualToString:@"No"]) 
    {
        [self parentViewController];
        HUD.labelText = NSLocalizedString(@"Unpacking","");
        HUD.detailsLabelText = @" ";
        //  wait for cleanup
        NSLog(@"Waiting for clean up");
        usleep(50000);
    }

    NSLog(@"++ Finished loops ++");
    NSLog(@"Finished HUD lessonDownloadProgress: %f", HUD.progress);

    [MBProgressHUD hideHUDForView:self.view animated:YES];
    [HUD removeFromSuperview];
    HUD.delegate = nil;

    [HUD release];
    HUD = nil;

}

Ответы [ 3 ]

0 голосов
/ 15 марта 2012

Реализовали ли вы метод делегата?

- (void)hudWasHidden:(MBProgressHUD *)hud {
    // Remove HUD from screen when the HUD was hidded
    [HUD removeFromSuperview];
    HUD = nil;
}
0 голосов
/ 16 февраля 2014

Это потому, что метка настроена на init.Попробуйте это:

Вы должны просто добавить этот метод в заголовочный файл MBProgressHud:

+ (MB_INSTANCETYPE)showHUDAddedTo:(UIView *)view withText:(NSString *)text;

И реализовать его вФайл .m выглядит следующим образом:

+ (MB_INSTANCETYPE)showHUDAddedTo:(UIView *)view withText:(NSString *)text
{
    MBProgressHUD *hud = [[self alloc] initWithView:view];
    hud.labelText = text;
    [view addSubview:hud];
    [hud show:YES];
    return MB_AUTORELEASE(hud);
}

и вызывайте его так, как вам нужно:

[MBProgressHUD showHUDAddedTo:self.view withText:@"Loading..."];
0 голосов
/ 15 марта 2012

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

Вместо опроса DataManager вы можете использовать KVO для наблюдения за свойствами на DataManager и реагирования на эти изменения. («Не звоните нам; мы вам позвоним.) Итак, вот вам предложенный подход, если хотите.

Ваш интерфейс класса:

@interface YourClass : UIViewController    // or whatever your superclass is...
{
    MBProgressHUD *_hud;
    DataManager *_dataManager;

    //  your other ivars
}
@end

Ив вашем файле реализации ...

@interface YourClass()
@property (nonatomic, retain) DataManager dataManager;
@end

Выше я объявил ваш dataManager как свойство, чтобы мы могли наблюдать его.

Чтобы начать процесс загрузки, у нас теперь есть метод downloadLesson:

- (void)downloadLesson;
{
    //  show HUD and retain it (showHUDAddedTo:animated: returns autoreleased object)
    MBProgressHUD *HUD = [MBProgressHUD showHUDAddedTo:self.view animated:YES] retain];

    //  observe properties on the dataManager
    [self addObserver:self forKeyPath:@"dataManager.progress" options:NSKeyValueObservingOptionNew context:nil];
    [self addObserver:self forKeyPath:@"dataManager.cleanedUp" options:NSKeyValueObservingOptionNew context:nil];
    [self addObserver:self forKeyPath:@"dataManager.downHUD" options:NSKeyValueObservingOptionNew context:nil];

    //  begin your download here...

    HUD.labelText = NSLocalizedString(@"Connecting", "");
    HUD.detailsLabelText = @" ";
    HUD.progress = self.dataManager.downHUD;
}

Теперь используйте KVO для обновления внешнего вида HUD:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
{
    if( [keyPath isEqualToString:@"dataManager.cleanedUp"] )
    {
        if( [[[self dataManager] cleanedUp] isEqualToString:@"Yes"] )
        {
            [MBProgressHUD hideHUDForView:[[UIApplication sharedApplication] keyWindow] animated:YES];
            [HUD release];  HUD = nil;
            [self removeObserver:self forKeyPath:@"dataManager.progress"];
            [self removeObserver:self forKeyPath:@"dataManager.cleanedUp"];
            [self removeObserver:self forKeyPath:@"dataManager.downHUD"];
        }
    }
    if( [keyPath isEqualToString:@"dataManager.downHUD"] )
    {
        //  if the data manager updates progress, update our HUD
        HUD.progress = self.dataManager.downHUD;
        if( self.dataManager.downHUD == 0.0 )
            //  no progress; we're just connecting
            HUD.labelText = NSLocalizedString(@"Connecting", "");
        else if( self.dataManager.downHUD < 1.0 )
        {
            //  progress >0.0 and < 1.0; we're downloading
            HUD.labelText = NSLocalizedString(@"Downloading", "");
            NSString *percent = [NSString stringWithFormat:@"%.0f%%", HUD.progress/1*100];
            HUD.detailsLabelText = percent;
        }
        else
        {
            //  progress == 1.0, but we haven't cleaned up, so unpacking
            if( [[[self dataManager] cleanedUp] isEqualToString:@"No"] )
            {
                HUD.labelText = NSLocalizedString(@"Unpacking","");
                HUD.detailLabelsText = @" ";
            }
        }
    }
}

В качестве альтернативы, вы можете использовать уведомления для обновления, где DataManager сообщений NSNotification s, для которых ваш контроллер представления зарегистрирован. Или, если вы были открыты для рефакторинга DataManager, вы могли бы использовать блоки для выполнения обновлений. Все эти решения избегают необходимости явно блокировать ваш поток для опроса DataManager.Надеюсь, это поможет.

...