我正在从我的 NSObject 类在服务器上上传数据,现在我想在上传数据时显示 MBProgressHUD,我知道如何使用 ViewController 显示 MBProgressHUD,但不知道如何使用 NSObject 类显示它。
6 回答
AppDelegate* delegate = [[UIApplication sharedApplication] delegate];
[delegate.window addSubview:HUD];
...
[HUD removeFromSuperview];
有几种方法可以解决此类问题。最常见的一种是使用委托模式,尽管您可以使用块、KVO 或通知。
你应该首先创建一个协议,这样你就可以在你UIViewController
和你NSObject
的调用者之间进行通信。尽管您不需要一个人来创建这种通信,但您应该使用它来拥有更灵活的代码。
通常,我会做这样的事情:
@protocol CommunicationDelegate <NSObject>
@required
-(void)communicationSucceed;
-(void)communicationFailedWithError:(NSError*)anError;
在您的内部NSObject
,您将有一个weak
符合协议的对象的引用CommunicationDelegate
。在你的 .h 你应该有这样的东西:
@property(nonatomic, weak) id <CommunicationDelegate> communicationDelegate;
就在你真正开始你的工作之前NSObject
,你应该做:
myObjectThatWillDoSomething.communicationDelegate = self;
此时,您的UIViewController
和您的NSObject
. 在 UIViewController 的 .h 文件中,添加以下内容:
@interface myViewController : UIViewController <CommunicationDelegate>
所以你UIViewController
遵守CommunicationDelegate
协议。
您现在可以MBProgressHUD
从您的UIViewController
. 完成NSObject
他的工作后,您可以致电:
[communicationDelegate communicationSucceed];
或者
[communicationDelegate communicationFailedWithError:anError]; //anError is used to describe what went wrong
一旦(其中一个)这些方法被调用,您就可以删除您的MBProgressHUD
. 了解此方法在您的UIViewController
.
使用 NSNotification Center 停止 Indicator,在视图控制器中用监听方法声明 NSNotification。并从 Webservice 文件发布通知。通知中心监听方法中的停止指示器。
这个链接可以帮助你
在您的上传器对象上创建一个委托协议
@protocol UploaderThingyDelegate <NSObject>
-(void)stuffStarted;
-(void)stuffEnded;
@end
@interface UploaderThingy : NSObject
@property (weak) id<UploaderThingyDelegate> delegate;
将您的相关 View 或 ViewController 设置为上传者委托并在那里触发 MBProgressHUD 添加/删除。
当您上传您的 NSObject 时,会显示一个视图,对吗?因此,在该视图中显示您的 HUD。您可能需要创建一个委托来通知视图何时开始下载、何时结束以及是否有错误。
这些下面的代码在 NSObject 文件中工作正常
第 1 步:下载https://github.com/jdg/MBProgressHUD
第 2 步:添加委托 MBProgressHUDDelegate
第三步:声明实例 MBProgressHUD *HUD;
第 4 步:在您想要的地方编写代码:
HUD = [[MBProgressHUD alloc] initWithWindow:[UIApplication sharedApplication].keyWindow];
[[UIApplication sharedApplication].keyWindow addSubview:HUD];
HUD.delegate = self;
HUD.labelText = @"Processing";
[HUD show:YES];