So zeigen Sie die Ladeanzeige in der oberen Statusleiste an


120

Ich habe festgestellt, dass einige Apps wie Safari und Mail beim Zugriff auf das Netzwerk eine Ladeanzeige in der Statusleiste (die Leiste ganz oben auf dem Telefon) anzeigen. Gibt es eine Möglichkeit, dasselbe in SDK-Apps zu tun, oder ist dies nur eine Sache von Apple?

Antworten:


213

Es ist in UIApplication:

Für Ziel C:

Anfang:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

Ende:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

Für schnell:

Anfang

UIApplication.shared.isNetworkActivityIndicatorVisible = true

Ende

UIApplication.shared.isNetworkActivityIndicatorVisible = false

1
Danke, das funktioniert perfekt. Nur eine Randnotiz: Der Simulator scheint diesen Wert zu ignorieren, was mich zunächst denken ließ, dass es nicht funktioniert hat.
Rustyshelf

11
@rustyshelf wird in den neueren Simulatoren angezeigt.
MrHus

2
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];// als Einzeiler
David Douglas

1
Für Swift-Syntax verwendenUIApplication.sharedApplication().networkActivityIndicatorVisible = true
moraisandre

2
Die Aktivitätsanzeige wird nicht in der Statusleiste des iPhone X
Melly

30

Ich fand die folgenden Makros ziemlich nützlich!

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

Sie können also einfach anrufen ShowNetworkActivityIndicator();oder HideNetworkActivityIndicator();aus Ihrer App heraus (sofern der Header natürlich enthalten ist!).


35
Warum nicht eine Kategorie für UIApplication definieren? Scheint viel schöner (und debuggbarer) als ein #define.
Barry Wark

25

Ich habe einen Singleton geschrieben, der das Problem mehrerer Verbindungen löst, indem er einen Zähler für das Geschehen hält (um zu vermeiden, dass der Status entfernt wird, wenn eine Verbindung zurückkehrt, aber eine andere noch aktiv ist):

Die Header-Datei:

#import <Foundation/Foundation.h>

@interface RMActivityIndicator : NSObject

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

+(RMActivityIndicator *)sharedManager;

@end

und Umsetzung:

#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

Beispiel:

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

3
Dank @Schrockwell habe ich es durch die Verwendung synchronisierter Blöcke weiter verbessert. Ich habe eine Rennbedingung gesehen, bei der die Aktivität nicht richtig verringert wurde.
Resh32

3
Schönes Beispiel, wie man einfache Dinge schwierig macht)
fnc12

19

Ein einzeiliger Code dafür:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

5

Sie müssen darauf achten, dass die Aktivitätsanzeige auch nach Abschluss Ihres Netzwerkanrufs ausgeblendet wird.

Wenn Sie verwenden AFNetworking, müssen Sie nicht viel tun.

Nehmen Sie folgende Änderungen in der AppDelegateKlasse vor:

  1. Importieren AFNetworking/AFNetworkActivityIndicatorManager.h

  2. Gib das ein didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]


1
Oder mit restkit ist es #import [[AFRKNetworkActivityIndicatorManager sharedManager] setEnabled: YES];
Deepwinter

4

Die Netzwerkaktivitätsanzeige in der Statusleiste war in iOS 13 veraltet .

Die Verwendung UIApplication.shared.isNetworkActivityIndicatorVisible = truefunktioniert nicht mehr.

Die Verfallsmeldung lautet:

Stellen Sie bei Bedarf eine benutzerdefinierte Benutzeroberfläche für Netzwerkaktivitäten in Ihrer App bereit.


2

Es kann auch hilfreich sein, sicherzustellen, dass Sie es auf dem Hauptthread ausführen, da es mit der Benutzeroberfläche zusammenhängt.

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

0

Wie viele gesagt haben, gibt es keine Netzwerkaktivitätsanzeige für das iPhone X und wahrscheinlich für die anderen neuen iPhones mit der Kerbe.

Ich bin auf diese unglaubliche Bibliothek gestoßen, die von Ortwin Gentz, FutureTap, geschrieben wurde: https://github.com/futuretap/FTLinearActivityIndicator

Dadurch wird der Indikator wieder genau dort platziert, wo er zum Zeitpunkt der Veröffentlichung des iPhone X war. Viele würden sich an den Indikator vom Typ Knight Rider erinnern.

Diese Bibliothek ist für Swift 4.2 verfügbar, daher müssen Sie die Swift -Spracheinstellungen wie hier beschrieben ändern: Typ 'NSAttributedStringKey' (auch bekannt als 'NSString') hat kein Mitglied 'font'.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.