Ios 存在活动指示器时禁用后台选择
我正在视图顶部添加活动指示器,希望在活动指示器打开时禁用背景中的选择。同样由于某些原因,我的活动指示器在数据显示在表视图上后仍会旋转约30-45秒(取决于网络速度)。我已经为活动指示器创建了一个类别 活动指标类别代码: 在表视图控制器中的用法:Ios 存在活动指示器时禁用后台选择,ios,objective-c,uiactivityindicatorview,Ios,Objective C,Uiactivityindicatorview,我正在视图顶部添加活动指示器,希望在活动指示器打开时禁用背景中的选择。同样由于某些原因,我的活动指示器在数据显示在表视图上后仍会旋转约30-45秒(取决于网络速度)。我已经为活动指示器创建了一个类别 活动指标类别代码: 在表视图控制器中的用法: 我做错了什么?为什么当活动指示器打开时,甚至在禁用用户交互后,我仍然能够在后台选择数据。将调用移动到HideActivityIndicator以查看调用内部的调度异步(dispatch\u get\u main\u queue()。这是一个UI调用,需要
我做错了什么?为什么当活动指示器打开时,甚至在禁用用户交互后,我仍然能够在后台选择数据。将调用移动到HideActivityIndicator以查看调用内部的
调度异步(dispatch\u get\u main\u queue()
。这是一个UI调用,需要在主线程上完成
至于如何禁用视图控制器上的其他操作,您有几个选项。我做的一件简单的事情是将活动指示器放在固定到整个屏幕的视图中,设置为不透明=假,颜色为黑色,alpha设置为0.5。这样,下面的内容是可见的,但用户无法单击它。您需要在“coveringView”中添加一个出口并显示隐藏它,而不是显示/隐藏活动指示器视图。dispatch\u async(dispatch\u get\u main\u queue()^{
[self.tableView重载数据];
});
修好它
[self-performSelectorOnMainThread:@selector(reloadData)with object:nil waitUntilDone:NO]
在dispatch\u async中移动HideActivityIndicator ForView调用对我有帮助。现在我的活动指示器消失了,很快我就在屏幕上看到了数据。这样我就看不到当数据在屏幕上时活动指示器仍在旋转的情况。我想我应该能够跳过添加不透明覆盖视图。谢谢@Dunc一个C!
- (UIView *)overlayView {
return objc_getAssociatedObject(self, OverlayViewKey);
}
- (void)setOverlayView:(UIView *)overlayView {
objc_setAssociatedObject(self, OverlayViewKey, overlayView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (void)showActivityIndicatorForView:(UIView *)view {
self.overlayView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
self.center = self.overlayView.center;
[view setUserInteractionEnabled:NO];
[[UIApplication sharedApplication] beginIgnoringInteractionEvents];
[self.overlayView setUserInteractionEnabled:NO];
[self startAnimating];
[self.overlayView addSubview:self];
[view addSubview:self.overlayView];
[view bringSubviewToFront:self.overlayView];
self.hidesWhenStopped = YES;
self.hidden = NO;
}
- (void)hideActivityIndicatorForView:(UIView *)view {
[self stopAnimating];
[self.overlayView setUserInteractionEnabled:YES];
[self.overlayView removeFromSuperview];
[[UIApplication sharedApplication] endIgnoringInteractionEvents];
[view setUserInteractionEnabled:YES];
}
@interface MyTableViewController()
@property (nonatomic, strong) UIActivityIndicatorView *activityIndicator;
@end
@implementation MyTableViewController
- (id) initWithSomething:(NSString *)something {
self = [super init];
if (self) {
self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
self.activityIndicator.overlayView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self getDataServiceRequest];
[self.activityIndicator showActivityIndicatorForView:self.navigationController.view];
}
- (void)requestCompletionCallBack sender:(ServiceAPI *)sender {
// Do something here with the data
[self.activityIndicator hideActivityIndicatorForView:self.navigationController.view];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
}
@end