StateViewController
一个 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"
然后确保您的UIViewController
、UITableViewController
或UICollectionViewController
实现StateViewController
协议。
@interface ViewController () <StateViewController>
// Code
@end
接下来,在viewDidLoad
中配置loadingView
、emptyView
和errorView
属性。
- (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
总是假设没有内容可显示。
但是,如果您的视图控制器属于类的 UITableViewController
或 UICollectionViewController
,则 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
- 电子邮件: [email protected]
- Twitter: @PavolKmet
灵感
这个Pod是从by Alexander Schuch中获取的灵感,略有不同。
许可证
StateViewController可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。