121

我注意到一些应用程序,如 Safari 和 Mail,在访问网络时会在状态栏(手机最顶部的栏)中显示加载指示器。有没有办法在 SDK 应用程序中做同样的事情,或者这是 Apple 唯一的事情?

4

8 回答 8

214

它在 UIApplication 中:

对于目标 C:

开始:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

结尾:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

对于迅速:

开始

UIApplication.shared.isNetworkActivityIndicatorVisible = true

结尾

UIApplication.shared.isNetworkActivityIndicatorVisible = false
于 2008-10-03T13:06:14.293 回答
30

我发现以下宏非常有用!

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

所以你可以在你的应用程序中调用ShowNetworkActivityIndicator();或调用HideNetworkActivityIndicator();(当然,只要包含标题!)。

于 2009-11-17T18:51:08.110 回答
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];
    }
于 2012-11-16T08:18:36.703 回答
19

执行此操作的单行代码:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
于 2012-11-29T10:33:09.343 回答
9

状态栏网络活动指示器在iOS 13中已弃用。

使用UIApplication.shared.isNetworkActivityIndicatorVisible = true将不再起作用。

弃用消息说:

如果需要,请在您的应用中提供自定义网络活动 UI。

于 2019-06-21T04:55:43.340 回答
5

完成网络呼叫后,您还需要注意隐藏活动指示器。

如果你使用AFNetworking,那么你不需要做太多事情。

在类中进行以下更改AppDelegate

  1. 进口AFNetworking/AFNetworkActivityIndicatorManager.h

  2. 把这个放进去didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]

于 2016-02-17T05:59:48.493 回答
2

确保您在主线程上运行它也可能会有所帮助,因为它与 UI 相关。

dispatch_async(dispatch_get_main_queue(), ^{
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
});
于 2015-03-13T19:49:42.730 回答
2

正如许多人所说,iPhone X 没有网络活动指示器,可能还有其他带有缺口的新 iPhone。

我遇到了这个由 Ortwin Gentz,FutureTap 编写的令人难以置信的库: https ://github.com/futuretap/FTLinearActivityIndi​​cator

它将指示器放回 iPhone X 最初发布时的位置,许多人会记得 Knight Rider 类型的指示器。

该库可用于 Swift 4.2,因此您需要更改 Swift 语言设置,如下所述: Type 'NSAttributedStringKey' (aka 'NSString') has no member 'font'

于 2018-11-08T02:45:33.523 回答