【问题标题】:How to show the loading indicator in the top status bar如何在顶部状态栏中显示加载指示器
【发布时间】:2010-09-15 01:37:19
【问题描述】:

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

【问题讨论】:

    标签: ios cocoa-touch


    【解决方案1】:

    它在 UIApplication 中:

    对于目标 C:

    开始:

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    

    结束:

    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    

    快速:

    开始

    UIApplication.shared.isNetworkActivityIndicatorVisible = true
    

    结束

    UIApplication.shared.isNetworkActivityIndicatorVisible = false
    

    【讨论】:

    • 感谢完美。顺便说一句:模拟器似乎忽略了这个值,这让我一开始觉得它不起作用。
    • @rustyshelf,它显示在较新的模拟器中。
    • [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; //作为一个班轮
    • 对于 Swift 语法使用 UIApplication.sharedApplication().networkActivityIndicatorVisible = true
    • 活动指示器不会显示在 iPhone X 的状态栏中
    【解决方案2】:

    我发现以下宏非常有用!

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

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

    【讨论】:

    • 为什么不在 UIApplication 上定义一个类别?似乎比#define 更好(并且更易于调试)。
    【解决方案3】:

    我写了一个单例,它通过保持一个正在发生的事情的计数器来解决多个连接的问题(以避免在一个连接返回但另一个连接仍然处于活动状态时删除状态):

    头文件:

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

    【讨论】:

    • 感谢@Schrockwell,我通过使用同步块进一步改进了它 - 我看到了活动没有正确减少的竞争条件。
    • 如何把简单的事情做困难的好例子)
    【解决方案4】:

    执行此操作的单行代码:

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    

    【讨论】:

      【解决方案5】:

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

      使用UIApplication.shared.isNetworkActivityIndicatorVisible = true 将不再有效。

      弃用消息说:

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

      【讨论】:

        【解决方案6】:

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

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

        在AppDelegate 类中进行以下更改:

        1. 导入AFNetworking/AFNetworkActivityIndicatorManager.h

        2. 把这个放到didFinishLaunchingWithOptions:

        [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]

        【讨论】:

        • 或者使用restkit,它将是#import [[AFRKNetworkActivityIndi​​catorManager sharedManager] setEnabled:YES];
        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          正如许多人所说,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'

          【讨论】:

            猜你喜欢
            • 2012-06-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-16
            相关资源
            最近更新 更多