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?

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

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!).


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];
    }

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;

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]


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.


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];
});

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'

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.