วิธีแสดงตัวบ่งชี้การโหลดในแถบสถานะด้านบน


120

ฉันสังเกตเห็นว่าแอพบางตัวเช่น Safari และ Mail แสดงตัวบ่งชี้การโหลดในแถบสถานะ (แถบที่ด้านบนสุดของโทรศัพท์) เมื่อพวกเขากำลังเข้าถึงเครือข่าย มีวิธีทำสิ่งเดียวกันในแอพ SDK หรือนี่เป็นเพียงสิ่งเดียวของ Apple?

คำตอบ:


213

มันอยู่ใน UIA

สำหรับวัตถุประสงค์ C:

ราคาเริ่มต้น:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

End:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

เพื่อความรวดเร็ว:

เริ่มต้น

UIApplication.shared.isNetworkActivityIndicatorVisible = true

ปลาย

UIApplication.shared.isNetworkActivityIndicatorVisible = false

1
ขอบคุณที่ทำงานได้อย่างสมบูรณ์ หมายเหตุด้านข้าง: เครื่องมือจำลองดูเหมือนจะไม่สนใจค่านี้ซึ่งทำให้ฉันคิดว่าในตอนแรกมันไม่ได้ผล
rustyshelf

11
@rustyshelf จะแสดงในเครื่องจำลองรุ่นใหม่
MrHus

2
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];// เป็นซับเดียว
David Douglas

1
สำหรับการใช้ไวยากรณ์ SwiftUIApplication.sharedApplication().networkActivityIndicatorVisible = true
moraisandre

2
ตัวบ่งชี้กิจกรรมจะไม่แสดงในแถบสถานะบน iPhone X
Melly

30

ฉันพบว่ามาโครต่อไปนี้มีประโยชน์มาก!

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

ดังนั้นคุณสามารถโทรShowNetworkActivityIndicator();หรือHideNetworkActivityIndicator();จากภายในแอปของคุณได้ (ตราบใดที่ส่วนหัวรวมอยู่ด้วยแน่นอน!)


35
ทำไมไม่กำหนดหมวดหมู่บน UIApplication? ดูเหมือนจะดีกว่ามาก (และแก้ไขได้มากกว่า) มากกว่า #define
Barry Wark

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

3
ขอบคุณ @Schrockwell ฉันปรับปรุงเพิ่มเติมโดยใช้บล็อกซิงโครไนซ์ - ฉันเห็นสภาพการแข่งขันที่กิจกรรมไม่ลดลงอย่างเหมาะสม
Resh32

3
ตัวอย่างที่ดีในการทำเรื่องง่ายๆเรื่องยาก ๆ )
fnc12

19

รหัสบรรทัดเดียวเพื่อทำสิ่งนั้น:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

5

คุณต้องดูแลการซ่อนตัวบ่งชี้กิจกรรมด้วยเมื่อการโทรผ่านเครือข่ายของคุณเสร็จสิ้น

ถ้าคุณใช้AFNetworkingแล้วคุณไม่จำเป็นต้องทำอะไรมาก

ดำเนินการตามการเปลี่ยนแปลงในAppDelegateคลาส:

  1. นำเข้า AFNetworking/AFNetworkActivityIndicatorManager.h

  2. ใส่สิ่งนี้เข้าไป didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]


1
หรือโดยใช้ restkit จะเป็น #import [[AFRKNetworkActivityIndicatorManager sharedManager] setEnabled: YES];
deepwinter

4

ตัวบ่งชี้กิจกรรมของเครือข่ายแถบสถานะได้รับการคัดค้านในiOS 13

การใช้UIApplication.shared.isNetworkActivityIndicatorVisible = trueจะไม่ทำงานอีกต่อไป

ข้อความเลิกใช้งานระบุว่า:

ระบุ UI กิจกรรมเครือข่ายที่กำหนดเองในแอปของคุณหากต้องการ


2

นอกจากนี้ยังอาจเป็นประโยชน์ในการตรวจสอบให้แน่ใจว่าคุณใช้งานบนเธรดหลักเนื่องจากเกี่ยวข้องกับ UI

dispatch_async(dispatch_get_main_queue(), ^{
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
});

0

อย่างที่หลายคนบอกไม่มีตัวบ่งชี้กิจกรรมเครือข่ายสำหรับ iPhone X และอาจเป็นสำหรับ iPhone รุ่นใหม่อื่น ๆ ที่มีรอยบาก

ฉันเจอห้องสมุดที่น่าทึ่งนี้เขียนโดย Ortwin Gentz, FutureTap: https://github.com/futuretap/FTLinearActivityIndicator

มันทำให้ตัวบ่งชี้กลับไปที่เดิมเมื่อ iPhone X เปิดตัวครั้งแรกหลายคนคงจำตัวบ่งชี้ประเภท Knight Rider ได้

ไลบรารีนี้มีให้สำหรับ Swift 4.2 ดังนั้นคุณจะต้องเปลี่ยนการตั้งค่าภาษา Swift ตามที่อธิบายไว้ที่นี่: พิมพ์ 'NSAttributedStringKey' (aka 'NSString') ไม่มีสมาชิก 'แบบอักษร'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.