ฉันสังเกตเห็นว่าแอพบางตัวเช่น Safari และ Mail แสดงตัวบ่งชี้การโหลดในแถบสถานะ (แถบที่ด้านบนสุดของโทรศัพท์) เมื่อพวกเขากำลังเข้าถึงเครือข่าย มีวิธีทำสิ่งเดียวกันในแอพ SDK หรือนี่เป็นเพียงสิ่งเดียวของ Apple?
ฉันสังเกตเห็นว่าแอพบางตัวเช่น Safari และ Mail แสดงตัวบ่งชี้การโหลดในแถบสถานะ (แถบที่ด้านบนสุดของโทรศัพท์) เมื่อพวกเขากำลังเข้าถึงเครือข่าย มีวิธีทำสิ่งเดียวกันในแอพ SDK หรือนี่เป็นเพียงสิ่งเดียวของ Apple?
คำตอบ:
มันอยู่ใน UIA
สำหรับวัตถุประสงค์ C:
ราคาเริ่มต้น:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
End:
[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;
คุณต้องดูแลการซ่อนตัวบ่งชี้กิจกรรมด้วยเมื่อการโทรผ่านเครือข่ายของคุณเสร็จสิ้น
ถ้าคุณใช้AFNetworking
แล้วคุณไม่จำเป็นต้องทำอะไรมาก
ดำเนินการตามการเปลี่ยนแปลงในAppDelegate
คลาส:
นำเข้า AFNetworking/AFNetworkActivityIndicatorManager.h
ใส่สิ่งนี้เข้าไป didFinishLaunchingWithOptions:
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]
ตัวบ่งชี้กิจกรรมของเครือข่ายแถบสถานะได้รับการคัดค้านในiOS 13
การใช้UIApplication.shared.isNetworkActivityIndicatorVisible = true
จะไม่ทำงานอีกต่อไป
ข้อความเลิกใช้งานระบุว่า:
ระบุ UI กิจกรรมเครือข่ายที่กำหนดเองในแอปของคุณหากต้องการ
นอกจากนี้ยังอาจเป็นประโยชน์ในการตรวจสอบให้แน่ใจว่าคุณใช้งานบนเธรดหลักเนื่องจากเกี่ยวข้องกับ UI
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
});
อย่างที่หลายคนบอกไม่มีตัวบ่งชี้กิจกรรมเครือข่ายสำหรับ iPhone X และอาจเป็นสำหรับ iPhone รุ่นใหม่อื่น ๆ ที่มีรอยบาก
ฉันเจอห้องสมุดที่น่าทึ่งนี้เขียนโดย Ortwin Gentz, FutureTap: https://github.com/futuretap/FTLinearActivityIndicator
มันทำให้ตัวบ่งชี้กลับไปที่เดิมเมื่อ iPhone X เปิดตัวครั้งแรกหลายคนคงจำตัวบ่งชี้ประเภท Knight Rider ได้
ไลบรารีนี้มีให้สำหรับ Swift 4.2 ดังนั้นคุณจะต้องเปลี่ยนการตั้งค่าภาษา Swift ตามที่อธิบายไว้ที่นี่: พิมพ์ 'NSAttributedStringKey' (aka 'NSString') ไม่มีสมาชิก 'แบบอักษร'