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)
与许多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/
| 归档时间: |
|
| 查看次数: |
15357 次 |
| 最近记录: |