Использование MBProgressHUD в глобальном масштабе + сделать его синглтон

Ваш массив слишком велик, чтобы вписаться в стек, подумайте об использовании кучи:

int *sieve = malloc(2000000 * sizeof(*sieve));

Если вы действительно хотите изменить размер стека, взгляните на этот документ.

Совет : - Не забудьте освободить динамически выделенную память, если она больше не нужна.

23
задан viral 30 June 2016 в 13:54
поделиться

5 ответов

Вы можете добавить это к классу по своему вкусу:

+ (MBProgressHUD *)showGlobalProgressHUDWithTitle:(NSString *)title {
    UIWindow *window = [[[UIApplication sharedApplication] windows] lastObject];
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:window animated:YES];
    hud.labelText = title;
    return hud;
}

+ (void)dismissGlobalHUD {
    UIWindow *window = [[[UIApplication sharedApplication] windows] lastObject];
    [MBProgressHUD hideHUDForView:window animated:YES];
}

Это может быть вызвано для любого класса. Вам не нужно сохранять строгую ссылку на HUD при использовании этих методов удобства класса.

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

Скрытие предыдущего экземпляра HUD перед показом нового довольно просто.

+ (MBProgressHUD *)showGlobalProgressHUDWithTitle:(NSString *)title {
    UIWindow *window = [[[UIApplication sharedApplication] windows] lastObject];
    [MBProgressHUD hideAllHUDsForView:window animated:YES];
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:window animated:YES];
    hud.labelText = title;
    return hud;
}
66
ответ дан Matej Bukovinski 30 June 2016 в 13:54
поделиться

Этот ответ - то, что я сейчас использую для 5-6 приложений, потому что он прекрасно работает и внутри блоков. Однако я нашел проблему с этим. Я могу сделать это показанным, но не могу заставить его исчезнуть, если также присутствует UIAlertView. Если вы посмотрите на реализацию, вы увидите, почему. Просто измените его следующим образом:

static UIWindow *window;

+ (MBProgressHUD *)showGlobalProgressHUDWithTitle:(NSString *)title {

    window = [[[UIApplication sharedApplication] windows] lastObject];
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:window animated:YES];
    hud.labelText = title;

    return hud;
}

+ (void)dismissGlobalHUD {

    [MBProgressHUD hideHUDForView:window animated:YES];
}

Это обеспечит удаление HUD из тех же окон, в которых он был показан.

3
ответ дан Community 30 June 2016 в 13:54
поделиться

Я использовал код от @Michael Shang и имел все виды противоречивого поведения при отображении HUD. Оказывается, использование последнего окна ненадежно, так как клавиатура iOS может просто его скрыть. Так что в большинстве случаев вы должны получить окно, используя AppDelegate, как упомянуто @David Lawson.

Вот как в Swift:

let window = UIApplication.sharedApplication().delegate!.window!!
let hud = MBProgressHUD.showHUDAddedTo(window, animated: true)

Однако, с учетом вышеизложенного ваш HUD будет отображаться за клавиатурой iOS (если они перекрываются). Если вам нужен HUD для наложения клавиатуры, используйте последний метод окна.

В моем случае я показываю HUD, затем вызываю resignFirstResponder(), немедленно скрывая окно, в которое был добавлен HUD. Так что это то, о чем нужно знать, единственное окно, которое гарантированно остается рядом, - это первое.

Я закончил тем, что создал метод, который при необходимости мог бы добавить HUD над клавиатурой:

func createHUD(size: CGSize, overKeyboard: Bool = false) -> MBProgressHUD {
    let window = overKeyboard ? UIApplication.sharedApplication().windows.last!
                              : UIApplication.sharedApplication().delegate!.window!!
    let hud = MBProgressHUD.showHUDAddedTo(window, animated: true)
    hud.minSize = size
    hud.bezelView.style = .SolidColor
    hud.bezelView.color = UIColor(white: 0, alpha: 0.8)
    return hud
}
0
ответ дан Code Baller 30 June 2016 в 13:54
поделиться

Чтобы показать один MBProgressHUD одновременно, вы можете проверить, добавлен ли HUD в том же виде или нет. Если нет, то добавьте HUD, иначе не добавляйте новый HUD.

-(void)showLoader{    
    dispatch_async(dispatch_get_main_queue(), ^{
        BOOL isHudAlreadyAdded = false;

        UIWindow *window = [[[UIApplication sharedApplication] windows] lastObject];
        NSEnumerator *subviewsEnum = [window.subviews reverseObjectEnumerator];
        for (UIView *subview in subviewsEnum) {
            if ([subview isKindOfClass:[MBProgressHUD class]]) {
                isHudAlreadyAdded = true;
            }
        }
        if(isHudAlreadyAdded == false){
            [MBProgressHUD showHUDAddedTo:window animated:YES];
        }
    });
}

-(void)hideLoader{
    dispatch_async(dispatch_get_main_queue(), ^{
        UIWindow *window = [[[UIApplication sharedApplication] windows] lastObject];
        [MBProgressHUD hideHUDForView:window animated:YES];
    });
}
0
ответ дан pkc456 30 June 2016 в 13:54
поделиться

Примечание : Учитывая мнения, которые получает этот Вопрос, я решил опубликовать способ, который я выбрал в качестве решения. Это НЕ ответ на мой вопрос. (Следовательно, принятый ответ остается принятым)

В то время я использовал SVProgressHUD , поскольку его было очень просто интегрировать и использовать.

Все, что вам нужно сделать, это просто перетащить папку SVProgressHUD / SVProgressHUD в ваш проект. (Вы также можете выбрать кокоаподы ИЛИ карфаген)

<час>

В Objective-C:

[SVProgressHUD show]; // Show
[SVProgressHUD dismiss]; // Dismiss
<час>

В Swift:

SVProgressHUD.show() // Show
SVProgressHUD.dismiss() // Dismiss

Кроме того, Показать и скрыть HUD необходимо выполнить в главном потоке . (В частности, вам нужно это, чтобы скрыть HUD в некотором закрытии в фоновом режиме)

Например:

dispatch_async(dispatch_get_main_queue(), ^{
    [SVProgressHUD dismiss]; // OR SHOW, whatever the need is.
});

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

MBProgressHUD по-прежнему остается хорошим выбором для разработчиков. Просто я нашел SVProgressHUD для своих нужд.

1
ответ дан viral 30 June 2016 в 13:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: