最近有给我反馈CDDPagerController框架有点小Bug,查看下源码还真是,生命周期那还真出了问题。我花了点时间解决了并重新更新的框架。
cd 项目 return pod update 更新下 最新版本 1.1.1
成功更新如下:
Installing CDDPagerController 1.1.1 (was 1.1.0)
Bug重现
有时候我们的父子控制器的标题数组是通过服务器请求返回的,这样就造成一种情况延迟。所以我进行了如下的模拟
#pragma mark - 添加所有子控制器
- (void)setUpAllChildViewController
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ //模拟网络延迟
NSArray *titles = @[@"测试01",@"测试02",@"测试03",@"测试04",@"测试05",@"测试06",@"测试07",@"测试08",@"测试09"];
for (NSInteger i = 0; i < titles.count; i++) {
UIViewController *vc = [UIViewController new];
vc.title = titles[i];
vc.view.backgroundColor = RandColor; //随机色
[self addChildViewController:vc];
}
});
}
Bug重现
GIF很直接的可以看出,模拟网络延迟之后,父子控制器并未能正常加载。可以看出很有可能是等模拟网络延迟在
addChildViewController
的时候,框架内部的生命周期已经结束了。
解决方案
我在DCPagerController.h声明类方法,供网络延迟使用
/**
刷新标题和整个界面,在调用之前,需要获取到所有的子控制器。
*/
- (void)setUpRefreshDisplay;
然后在网络延迟add之后调用刷新方法
#pragma mark - 添加所有子控制器
- (void)setUpAllChildViewController
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ //模拟网络延迟
NSArray *titles = @[@"测试01",@"测试02",@"测试03",@"测试04",@"测试05",@"测试06",@"测试07",@"测试08",@"测试09"];
for (NSInteger i = 0; i < titles.count; i++) {
UIViewController *vc = [UIViewController new];
vc.title = titles[i];
vc.view.backgroundColor = RandColor; //随机色
[self addChildViewController:vc];
}
[self setUpRefreshDisplay]; //刷新
});
}
解决
网友评论