Come mostrare l'indicatore di caricamento nella barra di stato in alto


120

Ho notato che alcune app come Safari e Mail mostrano un indicatore di caricamento nella barra di stato (la barra nella parte superiore del telefono) quando accedono alla rete. C'è un modo per fare la stessa cosa nelle app SDK o è solo una cosa Apple?

Risposte:


213

È in UIApplication:

Per l'obiettivo C:

Inizio:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

Fine:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

Per swift:

Inizio

UIApplication.shared.isNetworkActivityIndicatorVisible = true

Fine

UIApplication.shared.isNetworkActivityIndicatorVisible = false

1
Grazie che funziona perfettamente. Solo una nota a margine: il simulatore sembra ignorare questo valore, il che mi ha fatto pensare che all'inizio non funzionasse.
rustyshelf

11
@rustyshelf, viene visualizzato nei simulatori più recenti.
MrHus

2
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];// come one liner
David Douglas

1
Per l'uso della sintassi SwiftUIApplication.sharedApplication().networkActivityIndicatorVisible = true
moraisandre

2
L'indicatore di attività non verrà visualizzato nella barra di stato su iPhone X
Melly

30

Ho trovato le seguenti macro piuttosto utili!

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

Quindi puoi semplicemente chiamare ShowNetworkActivityIndicator();o HideNetworkActivityIndicator();dall'interno della tua app (a patto che l'intestazione sia inclusa ovviamente!).


35
Perché non definire una categoria su UIApplication? Sembra molto più carino (e più debuggabile) di un #define.
Barry Wark

25

Ho scritto un singleton che risolve il problema delle connessioni multiple tenendo un contatore di ciò che sta accadendo (per evitare di rimuovere lo stato quando una connessione ritorna ma un'altra è ancora attiva):

Il file di intestazione:

#import <Foundation/Foundation.h>

@interface RMActivityIndicator : NSObject

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

+(RMActivityIndicator *)sharedManager;

@end

e implementazione:

#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

Esempio:

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

3
Grazie @Schrockwell, l'ho ulteriormente migliorato utilizzando blocchi sincronizzati: ho visto una condizione di gara in cui l'attività non era diminuita correttamente.
Resh32


19

Un codice a riga singola per farlo:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

5

È necessario occuparsi di nascondere l'indicatore di attività anche una volta terminata la chiamata di rete.

Se usi AFNetworking, non devi fare molto.

Effettua le seguenti modifiche in AppDelegateclasse:

  1. Importare AFNetworking/AFNetworkActivityIndicatorManager.h

  2. Metti questo didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]


1
Oppure con restkit sarà #import [[AFRKNetworkActivityIndicatorManager sharedManager] setEnabled: YES];
deepwinter

4

L'indicatore dell'attività di rete della barra di stato è stato deprecato in iOS 13 .

L'utilizzo UIApplication.shared.isNetworkActivityIndicatorVisible = truenon funzionerà più.

Il messaggio di deprecazione dice:

Fornire un'interfaccia utente dell'attività di rete personalizzata nella tua app, se lo desideri.


2

Potrebbe anche essere utile assicurarsi di eseguirlo sul thread principale poiché è correlato all'interfaccia utente.

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

0

Come molti hanno detto, non esiste un indicatore di attività di rete per l'iPhone X e probabilmente per gli altri nuovi iPhone con il notch.

Mi sono imbattuto in questa incredibile libreria scritta da Ortwin Gentz, FutureTap: https://github.com/futuretap/FTLinearActivityIndicator

Riporta l'indicatore esattamente dove si trovava quando l'iPhone X è stato inizialmente rilasciato, molti ricorderebbero il tipo di indicatore Knight Rider.

Questa libreria è disponibile per Swift 4.2, quindi dovrai modificare le impostazioni della lingua di Swift, come descritto qui: Digita "NSAttributedStringKey" (aka "NSString") non ha un "carattere" membro

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.