J'ajoute un indicateur d'activité en haut de la vue et souhaite désactiver les sélections en arrière-plan lorsque l'indicateur d'activité est activé. Aussi pour une raison quelconque, mon indicateur d'activité tourne encore pendant environ 30-45 secondes (en fonction de la vitesse du réseau) après que les données sont affichées sur la vue de la table. J'ai créé une catégorie pour l'indicateur d'activité.Désactivation de la sélection en arrière-plan lorsqu'un indicateur d'activité est présent
Code catégorie Indicateur d'activité:
- (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];
}
usages dans contrôleur de vue de la table:
@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
Qu'est-ce que je fais mal ici? Pourquoi suis-je encore en mesure de sélectionner les données en arrière-plan lorsque l'indicateur d'activité est activé et même après la désactivation de l'interaction de l'utilisateur.
Déplacement appel hideActivityIndicatorForView à l'intérieur dispatch_async m'a aidé. Maintenant, mon indicateur d'activité disparaît et peu de temps après, je vois des données sur l'écran. Avec cela, je ne vois pas de scénario lorsque l'indicateur d'activité tourne encore pendant que les données sont à l'écran. Je pense que je devrais être capable d'ignorer l'ajout d'une vue de couverture opaque. Merci @Duncan C! –