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

vir*_*ral 23 iphone singleton ios 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.";
Run Code Online (Sandbox Code Playgroud)

在隐藏它的同时,从NetworkActivityManagerClass:

[MBProgressHUD hideHUDForView:appDelegate.navigationController.topViewController.view animated:YES];
Run Code Online (Sandbox Code Playgroud)

这使得项目在一段时间后崩溃(由于内存问题.)我在我的项目中使用ARC,而且,我正在使用ARC版本的MBProgressHUD.

我错过了什么吗?

重要问题:

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

请注意:在上面隐藏MBProgressHUD的代码中,View可能会改变显示MBProgressHUD时的状态.

任何帮助非常感谢.

Mat*_*ski 66

您可以将其添加到您喜欢的课程中:

+ (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];
}
Run Code Online (Sandbox Code Playgroud)

这可以在任何类上调用.使用这些类方便方法时,您无需对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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说效果更好:`UIWindow*window = [[UIApplication sharedApplication] delegate] .window`,它解决了旋转问题 (8认同)
  • 如果使用这种方式,进度HUD不会随设备方向旋转.谁有解决方案? (3认同)

Fat*_*tie 7

注意...

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

这些天你当然只是使用一个小事

容器视图

对于这样的任何问题.

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

MBProgressHUD在当天是一个奇迹般的解决方案,因为苹果公司的管道中有一个"激烈的漏洞".

但是(与过去的许多精彩事物一样),现在只是历史.今天不要做这样的事.


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

UIWindow *window = [[UIApplication sharedApplication] delegate].window
Run Code Online (Sandbox Code Playgroud)

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

#define APP ((AppDelegate *)[[UIApplication sharedApplication] delegate])
Run Code Online (Sandbox Code Playgroud)

AppDelegate.h

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

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 = @"";
}
Run Code Online (Sandbox Code Playgroud)

在代码中设置您使用它的标题- 因为您经常在运行期间更改它们.("第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];
    }];
}
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以将文本作为参数进行更改

你总是想要self.hud.minShowTime = 0.1; 避免闪烁

几乎总是self.hud.dimBackground = YES; 这也阻止了UI

从概念上讲,当你启动这样一个过程时,你通常必须"稍微等待"才能开始工作/结束工作,就像使用UI进行任何类似的编程一样.

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

-(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]; });
        }];
        }
    );
}
Run Code Online (Sandbox Code Playgroud)

方便的宏..

#define dispatch_after_secs_on_main( SS, BB )                   \
        dispatch_after(                                         \
            dispatch_time(DISPATCH_TIME_NOW, SS*NSEC_PER_SEC),  \
            dispatch_get_main_queue(),                          \
            BB                                                  \
            )
Run Code Online (Sandbox Code Playgroud)

现在这都是历史:) /sf/answers/1638278561/