2016-11-28 2 views
1

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.

Répondre

0

Déplacez votre appel à hideActivityIndicatorForView à l'intérieur de l'appel à dispatch_async(dispatch_get_main_queue(). C'est un appel d'interface utilisateur, et doit être fait sur le thread principal.

Pour désactiver les autres actions sur votre contrôleur de vue, vous disposez de quelques options. Une chose simple que j'ai faite est l'indicateur de l'activité de mettre dans une vue qui est épinglé à l'ensemble de l'écran, mis à opaque = false, et avec une couleur qui est noir avec un paramètre alpha de 0,5. De cette façon, le contenu en dessous est visible mais l'utilisateur ne peut pas cliquer dessus. Vous devez ajouter un point de vente à votre "coverageView" et afficher-masquer au lieu d'afficher/masquer l'affichage de l'indicateur d'activité.

+0

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! –

0

dispatch_async(dispatch_get_main_queue(), ^{ [self.tableView reloadData]; }); Réparez [self performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];