Як відобразити показник завантаження у верхній смузі стану


120

Я помітив, що деякі додатки, такі як Safari та Mail, показують індикатор завантаження в рядку стану (панелі в самому верху телефону), коли вони звертаються до мережі. Чи можна зробити те ж саме у програмах SDK, чи це лише Apple?

Відповіді:


213

Це в застосуванні UIA:

Для цілі C:

Початок:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

Кінець:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

Для швидкого:

Початок

UIApplication.shared.isNetworkActivityIndicatorVisible = true

Кінець

UIApplication.shared.isNetworkActivityIndicatorVisible = false

1
Завдяки цьому працює чудово. Лише бічна примітка: тренажер, здається, ігнорує це значення, через що я спочатку думав, що це не працює.
rustyshelf

11
@rustyshelf, він відображається в новіших тренажерах.
MrHus

2
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];// як один лайнер
Девід Дуглас

1
Для використання синтаксису SwiftUIApplication.sharedApplication().networkActivityIndicatorVisible = true
moraisandre

2
Індикатор активності не відображатиметься в рядку стану на iPhone X
Меллі

30

Наступні макроси я знайшов досить корисними!

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

Таким чином, ви можете просто зателефонувати ShowNetworkActivityIndicator();або HideNetworkActivityIndicator();зсередини програми (доки, звичайно, включений заголовок!).


35
Чому б не визначити категорію в застосуванні UIA? Здається, набагато приємніше (і налагоджувати), ніж #define.
Barry Wark

25

Я написав синглтон, який вирішує проблему декількох з'єднань, зберігаючи лічильник того, що відбувається (щоб уникнути видалення стану, коли з'єднання повертається, але інше все ще активне):

Файл заголовка:

#import <Foundation/Foundation.h>

@interface RMActivityIndicator : NSObject

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

+(RMActivityIndicator *)sharedManager;

@end

та реалізація:

#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

Приклад:

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

3
Завдяки @Schrockwell, я ще більше покращив його за допомогою синхронізованих блоків - я побачив стан гонки, коли активність не зменшувалася належним чином.
Реш32

3
Хороший приклад того, як робити прості речі важко)
fnc12

19

Код одного рядка для цього:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

5

Вам потрібно подбати про приховування показника активності також після того, як буде здійснено ваш мережевий дзвінок.

Якщо ви користуєтеся AFNetworking, то вам не потрібно робити багато.

Виконайте такі зміни в AppDelegateкласі:

  1. Імпорт AFNetworking/AFNetworkActivityIndicatorManager.h

  2. Покладіть це didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]


1
Або з restkit це буде #import [[AFRKNetworkActivityIndicatorManager sharedManager] setEnabled: ТАК];
deepwinter

4

У iOS 13 застарілий індикатор мережевої активності в Інтернеті застарів .

Використання UIApplication.shared.isNetworkActivityIndicatorVisible = trueбільше не працюватиме.

Повідомлення про анулювання говорить:

За бажанням надайте користувальницький інтерфейс активності в мережі.


2

Можливо, також буде корисно переконатися, що ви працюєте на головній темі, оскільки це пов'язано з інтерфейсом користувача.

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

0

Як багато хто говорив, для iPhone X і, ймовірно, для інших нових iPhone з індичкою немає індикатора мережевої активності.

Я натрапив на цю неймовірну бібліотеку, написану Ортвіном Генцем, FutureTap: https://github.com/futuretap/FTLinearActivityIndicator

Він повертає індикатор туди, де він був, коли iPhone X спочатку був випущений, багато хто пам’ятатиме тип індикатора Knight Rider.

Ця бібліотека доступна для Swift 4.2, тому вам потрібно буде змінити налаштування мови Swift, як описано тут: Введіть 'NSAttributedStringKey' (він же 'NSString') не має членського шрифту '

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.