123 votes

Comment afficher l'indicateur de chargement dans la barre d'état supérieure ?

J'ai remarqué que certaines applications comme Safari et Mail affichent un indicateur de chargement dans la barre d'état (la barre située tout en haut du téléphone) lorsqu'elles accèdent au réseau. Existe-t-il un moyen de faire la même chose dans les applications SDK, ou est-ce un phénomène propre à Apple ?

217voto

Stephen Darlington Points 33587

C'est dans UIApplication :

Pour Objective C :

Commencez :

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

Fin :

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

Pour le martinet :

Début

UIApplication.shared.isNetworkActivityIndicatorVisible = true

Fin

UIApplication.shared.isNetworkActivityIndicatorVisible = false

1 votes

Merci, cela fonctionne parfaitement. Juste une remarque : le simulateur semble ignorer cette valeur, ce qui m'a fait penser au début que cela ne fonctionnait pas.

11 votes

@rustyshelf, il s'affiche dans les simulateurs les plus récents.

2 votes

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; //comme un seul mot

30voto

Michael Waterfall Points 10490

J'ai trouvé les macros suivantes très utiles !

#define ShowNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = YES
#define HideNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = NO

Donc vous pouvez juste appeler ShowNetworkActivityIndicator(); ou HideNetworkActivityIndicator(); à partir de votre application (à condition que l'en-tête soit inclus, bien sûr !).

35 votes

Pourquoi ne pas définir une catégorie sur UIApplication ? Cela semble beaucoup plus agréable (et plus facile à déboguer) qu'un #define.

25voto

Resh32 Points 2986

J'ai écrit un singleton qui résout le problème des connexions multiples en gardant un compteur de ce qui se passe (pour éviter de supprimer l'état lorsqu'une connexion revient mais qu'une autre est toujours active) :

Le fichier d'en-tête :

#import <Foundation/Foundation.h>

@interface RMActivityIndicator : NSObject

-(void)increaseActivity;
-(void)decreaseActivity;
-(void)noActivity;

+(RMActivityIndicator *)sharedManager;

@end

et la mise en œuvre :

#import "RMActivityIndicator.h"

@interface RMActivityIndicator ()

@property(nonatomic,assign) unsigned int activityCounter;

@end

@implementation RMActivityIndicator

- (id)init
{
    self = [super init];
    if (self) {
        self.activityCounter = 0;
    }
    return self;
}

    -(void)increaseActivity{
        @synchronized(self) {
             self.activityCounter++;
        }
        [self updateActivity];
    }
-(void)decreaseActivity{
    @synchronized(self) {
           if (self.activityCounter>0) self.activityCounter--;
    }
    [self updateActivity];
}
-(void)noActivity{
    self.activityCounter = 0;
    [self updateActivity];
}

-(void)updateActivity{
    UIApplication* app = [UIApplication sharedApplication];
    app.networkActivityIndicatorVisible = (self.activityCounter>0);
}

#pragma mark -
#pragma mark Singleton instance

+(RMActivityIndicator *)sharedManager {
    static dispatch_once_t pred;
    static RMActivityIndicator *shared = nil;

    dispatch_once(&pred, ^{
        shared = [[RMActivityIndicator alloc] init];
    });
    return shared;
}

@end

Exemple :

    [[RMActivityIndicator sharedManager]increaseActivity];
    [NSURLConnection sendAsynchronousRequest:urlRequest queue:self.networkReceiveProcessQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
    {
        [[RMActivityIndicator sharedManager]decreaseActivity];
    }

3 votes

Merci @Schrockwell, je l'ai encore amélioré en utilisant des blocs synchronisés - j'ai vu une condition de course où l'activité ne diminuait pas correctement.

3 votes

Bel exemple de comment faire des choses simples difficiles)

19voto

ashish Points 2390

Une seule ligne de code pour le faire :

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

10voto

MohammadRF Points 1458

L'indicateur d'activité du réseau dans la barre d'état a été supprimé dans l'application iOS 13 .

Utilisation de UIApplication.shared.isNetworkActivityIndicatorVisible = true ne fonctionnera plus.

Le message de dépréciation dit :

Fournissez une interface utilisateur personnalisée pour l'activité du réseau dans votre application si vous le souhaitez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X