Cómo mostrar el indicador de carga en la barra de estado superior

120

He notado que algunas aplicaciones como Safari y Mail muestran un indicador de carga en la barra de estado (la barra en la parte superior del teléfono) cuando acceden a la red. ¿Hay alguna forma de hacer lo mismo en las aplicaciones SDK, o es solo una cosa de Apple?

estantería oxidada
fuente

Respuestas:

213

Está en la aplicación UIA:

Para el objetivo C:

Comienzo:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

Final:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

Para rápido:

comienzo

UIApplication.shared.isNetworkActivityIndicatorVisible = true

Final

UIApplication.shared.isNetworkActivityIndicatorVisible = false
Stephen Darlington
fuente
1
Gracias que funciona perfectamente. Solo una nota al margen: el simulador parece ignorar este valor, lo que me hizo pensar al principio que no funcionó.
rustyshelf
11
@rustyshelf, se muestra en los simuladores más nuevos.
MrHus
2
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];// como una sola línea
David Douglas
1
Para uso de sintaxis SwiftUIApplication.sharedApplication().networkActivityIndicatorVisible = true
moraisandre
2
El indicador de actividad no se mostrará en la barra de estado del iPhone X
Melly
30

¡He encontrado las siguientes macros bastante útiles!

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

Por lo tanto, puede llamar ShowNetworkActivityIndicator();o HideNetworkActivityIndicator();desde su aplicación (¡siempre que el encabezado esté incluido, por supuesto!).

Cascada de Michael
fuente
35
¿Por qué no definir una categoría en la aplicación UIA? Parece mucho más agradable (y más depurable) que un #define.
Barry Wark
25

Escribí un singleton que resuelve el problema de las conexiones múltiples manteniendo un contador de lo que está sucediendo (para evitar eliminar el estado cuando una conexión regresa pero otra aún está activa):

El archivo de encabezado:

#import <Foundation/Foundation.h>

@interface RMActivityIndicator : NSObject

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

+(RMActivityIndicator *)sharedManager;

@end

e implementación:

#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

Ejemplo:

    [[RMActivityIndicator sharedManager]increaseActivity];
    [NSURLConnection sendAsynchronousRequest:urlRequest queue:self.networkReceiveProcessQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
    {
        [[RMActivityIndicator sharedManager]decreaseActivity];
    }
Resh32
fuente
3
Gracias @Schrockwell, lo mejoré aún más usando bloques sincronizados: vi una condición de carrera en la que la actividad no disminuyó correctamente.
Resh32
3
Buen ejemplo de cómo hacer cosas simples difíciles)
fnc12
19

Un código de una sola línea para hacer eso:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
asish
fuente
5

Debe encargarse de ocultar el indicador de actividad también una vez que finalice la llamada de red.

Si lo usa AFNetworking, entonces no necesita hacer mucho.

Haga los siguientes cambios en la AppDelegateclase:

  1. Importar AFNetworking/AFNetworkActivityIndicatorManager.h

  2. Pon esto en didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]

Babu Lal
fuente
1
O con restkit será #import [[AFRKNetworkActivityIndicatorManager sharedManager] setEnabled: YES];
deepwinter
4

El indicador de actividad de la red de la barra de estado quedó obsoleto en iOS 13 .

El uso UIApplication.shared.isNetworkActivityIndicatorVisible = trueya no funcionará.

El mensaje de desaprobación dice:

Proporcione una interfaz de usuario de actividad de red personalizada en su aplicación si lo desea.

M Reza F
fuente
2

También puede ser útil asegurarse de que lo está ejecutando en el hilo principal, ya que está relacionado con la interfaz de usuario.

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

Como muchos han dicho, no hay un indicador de actividad de red para el iPhone X y probablemente para los otros iPhones nuevos con la muesca.

Me encontré con esta increíble biblioteca escrita por Ortwin Gentz, FutureTap: https://github.com/futuretap/FTLinearActivityIndicator

Vuelve a colocar el indicador donde estaba cuando se lanzó inicialmente el iPhone X, muchos recordarían el tipo de indicador Knight Rider.

Esta biblioteca está disponible para Swift 4.2, por lo que deberá cambiar la configuración de Swift Language, como se describe aquí: Escriba 'NSAttributedStringKey' (también conocido como 'NSString') no tiene miembro 'fuente'

erickva
fuente