【发布时间】:2010-09-15 01:37:19
【问题描述】:
我注意到 Safari 和 Mail 等一些应用程序在访问网络时会在状态栏(手机最顶部的栏)中显示加载指示器。有没有办法在 SDK 应用程序中做同样的事情,或者这是 Apple 唯一的事情?
【问题讨论】:
标签: ios cocoa-touch
我注意到 Safari 和 Mail 等一些应用程序在访问网络时会在状态栏(手机最顶部的栏)中显示加载指示器。有没有办法在 SDK 应用程序中做同样的事情,或者这是 Apple 唯一的事情?
【问题讨论】:
标签: ios cocoa-touch
它在 UIApplication 中:
对于目标 C:
开始:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
结束:
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
快速:
开始
UIApplication.shared.isNetworkActivityIndicatorVisible = true
结束
UIApplication.shared.isNetworkActivityIndicatorVisible = false
【讨论】:
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; //作为一个班轮
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
我发现以下宏非常有用!
#define ShowNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = YES
#define HideNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = NO
所以你可以在你的应用程序中调用ShowNetworkActivityIndicator(); 或HideNetworkActivityIndicator();(当然,只要包含标题!)。
【讨论】:
我写了一个单例,它通过保持一个正在发生的事情的计数器来解决多个连接的问题(以避免在一个连接返回但另一个连接仍然处于活动状态时删除状态):
头文件:
#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];
}
【讨论】:
执行此操作的单行代码:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
【讨论】:
状态栏网络活动指示器在 iOS 13 中已弃用。
使用UIApplication.shared.isNetworkActivityIndicatorVisible = true 将不再有效。
弃用消息说:
如果需要,请在您的应用中提供自定义网络活动 UI。
【讨论】:
网络调用完成后,您还需要注意隐藏活动指示器。
如果你使用AFNetworking,那么你不需要做太多。
在AppDelegate 类中进行以下更改:
导入AFNetworking/AFNetworkActivityIndicatorManager.h
把这个放到didFinishLaunchingWithOptions:
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]
【讨论】:
确保您在主线程上运行它也可能会有所帮助,因为它与 UI 相关。
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
});
【讨论】:
正如许多人所说,iPhone X 没有网络活动指示器,可能还有其他带有缺口的新 iPhone。
我偶然发现了这个由 FutureTap 的 Ortwin Gentz 编写的令人难以置信的库: https://github.com/futuretap/FTLinearActivityIndicator
它将指示器放回 iPhone X 最初发布时的位置,许多人会记得 Knight Rider 类型的指示器。
该库可用于 Swift 4.2,因此您需要更改 Swift 语言设置,如下所述: Type 'NSAttributedStringKey' (aka 'NSString') has no member 'font'
【讨论】: