全球使用MBProgressHUD +使其成为单身人士

在我的项目中,每个用户交互事件都会进行网络调用(即TCP,而不是HTTP)。 我需要活动指示器是全局的,以便从随机UIViewController 显示隐藏NetworkActivityManager类(处理网络活动的自定义类,它不是UIViewController或UIView的子类)中。

在搜索网页后,我发现MBProgressHUD用于同一目的,但我无法找到关于如何在全球范围内使用它的示例。 (通过说全局我是指MBProgressHUD的单例对象和用于显示和隐藏它的类方法。)

以下是我已经尝试过,但失败:在AppDelegate.h:

@property (nonatomic, retain) MBProgressHUD *hud;

AppDelegate.m中:

@synthesize hud;

在一些随机的UIViewController对象中:

appDelegate.hud = [MBProgressHUD showHUDAddedTo:appDelegate.navigationController.topViewController.view animated:YES];
appDelegate.hud.labelText = @"This will take some time.";

在从NetworkActivityManager类中隐藏它时:

[MBProgressHUD hideHUDForView:appDelegate.navigationController.topViewController.view animated:YES];

这会让项目在一段时间后崩溃(由于内存问题)。我在我的项目中使用了ARC,并且还使用了ARC版本的MBProgressHUD

我错过了什么吗?

重要问题:

我可以使MBProgressHUD像UIAlertView 一样工作吗? (说我的意思是独立于UIView的MBProgressHUD的实现 - 它使用showHUDAddedTo:呈现它自己)???

请注意:在隐藏MBProgressHUD的上述代码中,View可能会与显示MBProgressHUD时的内容相比发生变化。

任何帮助不胜感激。


你可以将它添加到你喜欢的类中:

+ (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实例之前隐藏以前的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;
}

注意...

与许多iOS问题一样,现在这已经过时了,完全过时了。

现在,你当然只是使用一个微不足道的

容器视图

对于这样的任何问题。

全容器视图教程初学者..教程!

MBProgressHUD是当天神奇的解决方案,因为苹果公司正在制定一个“严重漏洞”。

但是(如同过去许多美妙的事物一样),这只是现在的历史。 今天不要做这样的事情。


只是FWIW,2014,这是我们使用的一个非常简单的设置。 Per David Lawson ...

UIWindow *window = [[UIApplication sharedApplication] delegate].window

正如Matej所说,只需使用AppDelegate ...

#define APP ((AppDelegate *)[[UIApplication sharedApplication] delegate])

AppDelegate.h

// our convenient huddie system (messages with a hud, spinner)
@property (nonatomic, strong) MBProgressHUD *hud;
-(void)huddie;

AppDelegate.m

-(void)huddie
{
// centralised location for MBProgressHUD
[self.hud hide:YES];

UIWindow *windowForHud = [[UIApplication sharedApplication] delegate].window;
self.hud = [MBProgressHUD showHUDAddedTo:windowForHud animated:YES];

self.hud.dimBackground = YES;
self.hud.minShowTime = 0.1;
self.hud.labelText = @"";
self.hud.detailsLabelText = @"";
}

在您的代码中使用它的地方设置标题 - 因为在运行过程中经常更改它们 。 (“步骤1”...“步骤2”等)

-(void)loadBlahFromCloud
{
[APP huddie];
APP.hud.labelText = @"Connecting to Parse...";
APP.hud.detailsLabelText = @"step 1/2";

[blah refreshFromCloudThen:
    ^{
    [... example];
    }];
}

-(void)example
{
APP.hud.labelText = @"Connecting to the bank...";
APP.hud.detailsLabelText = @"step 2/2";

[blah sendDetailsThen:
    ^{
    [APP.hud hide:YES];
    [...  showNewDisplay];
    }];
}

如果你愿意的话,可以改变混乱方式将文本作为参数

你总是希望self.hud.minShowTime = 0.1; 避免闪烁

几乎总是self.hud.dimBackground = YES; 这也阻止了用户界面

从概念上讲,当你提出这样一个过程时, 通常不得不“稍等”开始工作/结束工作 ,就像在用户界面上进行类似的编程一样。

所以在实践中,代码通常看起来像这样...

-(void)loadActionSheets
{
[APP huddie];
APP.hud.labelText = @"Loading json from net...";

dispatch_after_secs_on_main(0.1 ,
    ^{
    [STUBS refreshNowFromCloudThen:
        ^{
        [APP.hud hide:YES];
        dispatch_after_secs_on_main(0.1 , ^{ [self buildActionsheet]; });
        }];
        }
    );
}

方便的宏..

#define dispatch_after_secs_on_main( SS, BB )                   
        dispatch_after(                                         
            dispatch_time(DISPATCH_TIME_NOW, SS*NSEC_PER_SEC),  
            dispatch_get_main_queue(),                          
            BB                                                  
            )

这是现在所有的历史:) https://stackoverflow.com/a/23403979/294884


这个答案是我现在使用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。

链接地址: http://www.djcxy.com/p/87707.html

上一篇: Use of MBProgressHUD Globally + make it singleton

下一篇: How do I access the viewcontroller