web-dev-qa-db-fra.com

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

J'ai remarqué que certaines applications telles que Safari et Mail affichent un indicateur de chargement dans la barre d'état (la barre 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 s’agit-il d’une seule chose d’Apple?

116
rustyshelf

C'est dans UIApplication:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

pour Swift:

UIApplication.shared.isNetworkActivityIndicatorVisible = true
205

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

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

Vous pouvez donc simplement appeler ShowNetworkActivityIndicator(); ou HideNetworkActivityIndicator(); à partir de votre application (tant que l'en-tête est bien entendu!).

30
Michael Waterfall

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 le statut lorsqu'une connexion est rétablie 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 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];
    }
25
Resh32

Un code de ligne unique pour le faire:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
19
asish

Vous devez également cacher l'indicateur d'activité une fois votre appel réseau terminé.

Si vous utilisez AFNetworking, vous n'avez pas besoin de faire grand chose.

Effectuez les modifications suivantes dans la classe AppDelegate:

  1. Importer AFNetworking/AFNetworkActivityIndicatorManager.h

  2. Mettez ceci dans didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]

5
Babu Lal

Il peut également être utile de s’assurer que vous l’exécutez sur le thread principal car il est lié à l’interface utilisateur. 

dispatch_async(dispatch_get_main_queue(), ^{
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
});
2
Sev

L'indicateur d'activité réseau de la barre d'état était obsolète dans iOS 1.

Utiliser UIApplication.shared.isNetworkActivityIndicatorVisible = true ne fonctionnera plus.

Le message de dépréciation dit:

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

0
Mo Reza Farahani