Zauważyłem, że niektóre aplikacje, takie jak Safari i poczta, wyświetlają wskaźnik ładowania na pasku stanu (pasek na samej górze telefonu), gdy uzyskują dostęp do sieci. Czy istnieje sposób, aby zrobić to samo w aplikacjach SDK, czy jest to tylko sprawa Apple?Jak wyświetlić wskaźnik ładowania na górnym pasku stanu?
Odpowiedz
Jest w UIApplication:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
dla SWIFT:
UIApplication.shared.isNetworkActivityIndicatorVisible = true
Znalazłem następujące makra bardzo przydatne!
#define ShowNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = YES
#define HideNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = NO
więc można po prostu zadzwonić ShowNetworkActivityIndicator();
lub HideNetworkActivityIndicator();
z poziomu aplikacji (tak długo, jak nagłówek jest włączone oczywiście!).
Dlaczego nie zdefiniować kategorii na UIApplication? Wydaje się dużo ładniejszy (i bardziej debuggable) niż #define. –
Napisałem singleton, który rozwiązuje problem wielu połączeń poprzez utrzymywanie licznika, co się dzieje (aby uniknąć usunięcia stanu, gdy powróci połączenie, ale drugi jest nadal aktywny):
Plik nagłówka:
#import <Foundation/Foundation.h>
@interface RMActivityIndicator : NSObject
-(void)increaseActivity;
-(void)decreaseActivity;
-(void)noActivity;
+(RMActivityIndicator *)sharedManager;
@end
i realizacja
#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
przykład:
[[RMActivityIndicator sharedManager]increaseActivity];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:self.networkReceiveProcessQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
[[RMActivityIndicator sharedManager]decreaseActivity];
}
Pojedyncza linia kodu, aby to zrobić:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
Może to również być pomocne do upewnij się, że działa to na głównym wątku, ponieważ jest to związane z UI.
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
});
Musisz zadbać o ukrywanie wskaźnika aktywności również po zakończeniu połączenia sieciowego.
Jeśli używasz AFNetworking
, to nie musisz dużo robić.
zrobić następujące zmiany w AppDelegate
klasy:
importu
AFNetworking/AFNetworkActivityIndicatorManager.h
umieścić to w
didFinishLaunchingWithOptions:
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]
Lub z restkitem będzie to #import [[AFRKNetworkActivityIndicatorManager sharedManager] setEnabled: YES]; – deepwinter
Dzięki który działa doskonale. Tylko jedna uwaga: symulator zdaje się ignorować tę wartość, która sprawiła, że początkowo nie działała. – rustyshelf
@ labelyshelf, wyświetla się w nowszych symulatorach. – MrHus
'[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible: YES];' // jako jedna liniówka –