Câu trả lời:
Nó nằm trong Ứng dụng UIA:
Đối với Mục tiêu C:
Khởi đầu:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
Kết thúc:
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
Đối với nhanh chóng:
Khởi đầu
UIApplication.shared.isNetworkActivityIndicatorVisible = true
Kết thúc
UIApplication.shared.isNetworkActivityIndicatorVisible = false
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
// như một liner
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
Tôi thấy các macro sau đây khá hữu ích!
#define ShowNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = YES
#define HideNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = NO
Vì vậy, bạn có thể chỉ cần gọi ShowNetworkActivityIndicator();
hoặc HideNetworkActivityIndicator();
từ trong ứng dụng của mình (tất nhiên là miễn là có tiêu đề!).
Tôi đã viết một singleton giải quyết vấn đề của nhiều kết nối bằng cách giữ một bộ đếm những gì đang xảy ra (để tránh xóa trạng thái khi một kết nối quay trở lại nhưng một kết nối khác vẫn hoạt động):
Tệp tiêu đề:
#import <Foundation/Foundation.h>
@interface RMActivityIndicator : NSObject
-(void)increaseActivity;
-(void)decreaseActivity;
-(void)noActivity;
+(RMActivityIndicator *)sharedManager;
@end
Và thực hiệ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
Thí dụ:
[[RMActivityIndicator sharedManager]increaseActivity];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:self.networkReceiveProcessQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
[[RMActivityIndicator sharedManager]decreaseActivity];
}
Bạn cũng cần chú ý đến việc ẩn chỉ báo hoạt động sau khi cuộc gọi mạng của bạn hoàn tất.
Nếu bạn sử dụng AFNetworking
, thì bạn không cần phải làm gì nhiều.
Thực hiện các thay đổi sau trong AppDelegate
Lớp:
Nhập khẩu AFNetworking/AFNetworkActivityIndicatorManager.h
Đặt cái này vào didFinishLaunchingWithOptions:
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]
Chỉ báo hoạt động mạng trên thanh trạng thái không được dùng nữa trong iOS 13 .
Sử dụng UIApplication.shared.isNetworkActivityIndicatorVisible = true
sẽ không hoạt động nữa.
Thông báo ngừng sử dụng cho biết:
Cung cấp giao diện người dùng hoạt động mạng tùy chỉnh trong ứng dụng của bạn nếu muốn.
Như nhiều người đã nói, không có chỉ báo hoạt động mạng cho iPhone X và có thể cho các iPhone mới khác có notch.
Tôi đã xem qua thư viện đáng kinh ngạc này được viết bởi Ortwin Gentz, FutureTap: https://github.com/futuretap/FTLinearActivityIndicator
Nó đưa chỉ báo trở lại vị trí ban đầu khi iPhone X được phát hành, nhiều người sẽ nhớ loại chỉ báo Knight Rider.
Thư viện này có sẵn cho Swift 4.2, vì vậy bạn sẽ cần thay đổi cài đặt Ngôn ngữ Swift, như được mô tả ở đây: Nhập 'NSAttributedStringKey' (hay còn gọi là 'NSString') không có thành viên 'phông chữ'