Cara menampilkan indikator pemuatan di bilah status atas


120

Saya perhatikan bahwa beberapa aplikasi seperti Safari dan Mail menampilkan indikator pemuatan di bilah status (bilah di bagian paling atas ponsel) saat mereka mengakses jaringan. Apakah ada cara untuk melakukan hal yang sama di aplikasi SDK, atau apakah ini hanya untuk Apple?

Jawaban:


213

Ada di UIApplication:

Untuk Tujuan C:

Mulailah:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

Akhir:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

Untuk cepat:

Mulailah

UIApplication.shared.isNetworkActivityIndicatorVisible = true

Akhir

UIApplication.shared.isNetworkActivityIndicatorVisible = false

1
Terima kasih, itu berfungsi dengan sempurna. Sekadar catatan: simulator tampaknya mengabaikan nilai ini, yang membuat saya berpikir pada awalnya itu tidak berfungsi.
Rustyshelf

11
@rustyshelf, ini ditampilkan di simulator yang lebih baru.
MrHus

2
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];// sebagai satu liner
David Douglas

1
Untuk penggunaan sintaks SwiftUIApplication.sharedApplication().networkActivityIndicatorVisible = true
moraisandre

2
Indikator aktivitas tidak akan ditampilkan di bilah status pada iPhone X
Melly

30

Saya telah menemukan makro berikut cukup berguna!

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

Jadi Anda bisa memanggil ShowNetworkActivityIndicator();atau HideNetworkActivityIndicator();dari dalam aplikasi Anda (selama header disertakan tentunya!).


35
Mengapa tidak menentukan kategori di UIApplication? Tampaknya jauh lebih baik (dan lebih dapat di-debug) daripada #define.
Barry Wark

25

Saya menulis singleton yang memecahkan masalah beberapa koneksi dengan menyimpan penghitung dari apa yang terjadi (untuk menghindari penghapusan status ketika koneksi kembali tetapi yang lain masih aktif):

File header:

#import <Foundation/Foundation.h>

@interface RMActivityIndicator : NSObject

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

+(RMActivityIndicator *)sharedManager;

@end

dan implementasi:

#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

Contoh:

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

3
Terima kasih @Schrockwell, saya lebih meningkatkannya dengan menggunakan blok tersinkronisasi - Saya melihat kondisi balapan di mana aktivitas tidak berkurang dengan benar.
Resh32

3
Contoh bagus tentang bagaimana melakukan hal-hal sederhana yang sulit)
fnc12

19

Kode baris tunggal untuk melakukan itu:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

5

Anda harus berhati-hati dalam menyembunyikan indikator aktivitas setelah panggilan jaringan Anda selesai.

Jika Anda menggunakan AFNetworking, maka Anda tidak perlu berbuat banyak.

Lakukan perubahan berikut di AppDelegateKelas:

  1. Impor AFNetworking/AFNetworkActivityIndicatorManager.h

  2. Masukkan ini didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]


1
Atau dengan restkit itu akan menjadi #import [[AFRKNetworkActivityIndicatorManager sharedManager] setEnabled: YES];
musim dingin

4

Indikator aktivitas jaringan bilah status sudah tidak digunakan lagi di iOS 13 .

Penggunaan UIApplication.shared.isNetworkActivityIndicatorVisible = truetidak akan berfungsi lagi.

Pesan penghentian mengatakan:

Sediakan UI aktivitas jaringan kustom di aplikasi Anda jika diinginkan.


2

Mungkin juga berguna untuk memastikan Anda menjalankannya di thread utama karena terkait dengan UI.

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

0

Seperti yang dikatakan banyak orang, tidak ada indikator aktivitas jaringan untuk iPhone X dan mungkin untuk iPhone baru lainnya dengan takik.

Saya menemukan perpustakaan luar biasa ini yang ditulis oleh Ortwin Gentz, FutureTap: https://github.com/futuretap/FTLinearActivityIndicator

Ini menempatkan indikator tepat di belakang ketika iPhone X pertama kali dirilis, banyak yang akan mengingat jenis indikator Knight Rider.

Pustaka ini tersedia untuk Swift 4.2, jadi Anda perlu mengubah pengaturan Bahasa Swift, seperti yang dijelaskan di sini: Ketik 'NSAttributedStringKey' (alias 'NSString') tidak memiliki 'font' anggota

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.