J'ai remarqué que certaines applications comme Safari et Mail affichent un indicateur de chargement dans la barre d'état (la barre tout en haut du téléphone) lorsqu'ils accèdent au réseau. Existe-t-il un moyen de faire la même chose dans les applications SDK, ou est-ce uniquement une chose Apple?Comment afficher l'indicateur de chargement dans la barre d'état supérieure
Répondre
Il est en UIApplication:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
pour rapide:
UIApplication.shared.isNetworkActivityIndicatorVisible = true
J'ai trouvé les macros suivantes très utile!
#define ShowNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = YES
#define HideNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = NO
Vous pouvez simplement appeler ShowNetworkActivityIndicator();
ou HideNetworkActivityIndicator();
à partir de votre application (tant que l'en-tête est inclus bien sûr!).
Pourquoi ne pas définir une catégorie sur UIApplication? Cela semble beaucoup plus agréable (et plus débogable) qu'un #define. –
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 d'enlever le statut quand un rendement de connexion, mais une autre est toujours actif):
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];
}
Un code de ligne unique pour le faire:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
Il peut également être utile de vous assurer que vous utilisez sur le thread principal car il est lié à l'interface utilisateur.
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
});
Vous devez également prendre soin de masquer l'indicateur d'activité une fois votre appel réseau terminé.
Si vous utilisez AFNetworking
, vous n'avez pas besoin de faire grand-chose.
Do changements suivants dans AppDelegate
Classe:
importation
AFNetworking/AFNetworkActivityIndicatorManager.h
Mettre cela en
didFinishLaunchingWithOptions:
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]
Ou avec le kit de repos, il sera #import [[AFRKNetworkActivityIndicatorManager sharedManager] setEnabled: YES]; – deepwinter
Merci qui fonctionne parfaitement. Juste une note de côté: le simulateur semble ignorer cette valeur, ce qui m'a fait penser au début que ça ne marchait pas. – rustyshelf
@rustyshelf, il s'affiche dans les nouveaux simulateurs. – MrHus
'[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible: YES];' // en tant que ligne unique –