StateViewController 0.8.0

StateViewController 0.8.0

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布上次发布2021年2月

Pavol KmetPavol Kmeť 维护。



StateViewController

Version License Platform

一个 MVC 分类,用于展示加载、错误和空状态下的 UIView。

需求

  • iOS 8.0+
  • Xcode 7.0+
  • Objective-C

它也兼容 Swift。

安装

CocoaPods

StateViewController 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中

pod 'StateViewController'

然后只需运行 pod install

手动

只需将文件夹Source中的所有文件拖放到StateViewController中,然后在项目中选择若需要则复制项

概览

状态视图控制器让您轻松管理四个最常见的状态

  • 加载状态:视图控制器从网络加载数据。将展示加载视图
  • 错误状态:在从网络加载数据时发生错误。将展示错误视图
  • 空状态:已检索到数据,但内容不可用。将展示空视图
  • 内容状态:内容可用并展示。

使用

首先确保已导入类别。

CocoaPods

#import <StateViewController/UIViewController+StateViewController.h>

手动

#import "UIViewController+StateViewController.h"

然后确保您的UIViewControllerUITableViewControllerUICollectionViewController实现StateViewController协议。

@interface ViewController () <StateViewController>
 // Code
@end

接下来,在viewDidLoad中配置loadingViewemptyViewerrorView属性。

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.loadingView = // Custom loading view type of UIView
    self.errorView = // Custom error view type of UIView
    self.emptyView = // Custom empty view type of UIView
}

然后,在viewWillAppear:方法中,必须调用setupInitialState方法,该方法名表示初始化视图控制器状态。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    [self setupInitialState];
}

之后,只需告诉视图控制器何时正在加载数据,StateViewController将为您显示和隐藏正确的加载、错误和空视图。

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // After setting loading, error, empty views
    [self fetchData];
}

- (void)fetchData
{
    [self startLoadingAnimated:YES completion:nil];
    
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://example.com"]];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) {
        //
        [self endLoadingAnimated:YES error:error completion:nil];
    }];
    [task resume];
}

生命周期

StateViewController 调用 hasContent 方法来检查是否有内容可显示。如果您在自己的 UIViewController 中未实现此方法,则 StateViewController 总是假设没有内容可显示。

但是,如果您的视图控制器属于类的 UITableViewControllerUICollectionViewController,则 StateViewController 在默认实现中检查 numberOfSections > 0

- (BOOL)hasContent
{
    return self.people.count > 0;
}

您可能还希望即使在内容已经显示的情况下也响应错误。在这种情况下,StateViewController 不会显示 errorView,因为已存在可以显示的内容。

例如,要显示自定义警报或其他错误消息,请使用 handleErrorWhenContentsAvailable: 手动向用户显示错误。

- (void)handleErrorWhenContentsAvailable:(NSError *)error
{
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Error" message:error.localizedDescription preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]];
    
    [self presentViewController:alert animated:YES completion:nil];
}

配置

如果您的视图(加载、错误、空视图)应该有内边距,您可以在视图控制器方法 insetForStateView: 中实现,该方法在每次显示视图之前被调用。

- (UIEdgeInsets)insetForStateView:(UIView *)stateView
{
    return UIEdgeInsetsZero;
}

您还可以在将每个视图添加到视图层次之前自定义您的视图(空视图、错误视图)。

空视图

- (UIView *)configureEmptyView:(UIView *)view
{
    return view;
}

默认实现不执行任何操作。

错误视图

- (UIView *)configureErrorView:(UIView *)view withError:(NSError *)error
{
    return view;
}

默认实现不执行任何操作。

作者

Pavol Kmet

灵感

这个Pod是从by Alexander Schuch中获取的灵感,略有不同。

许可证

StateViewController可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。