上面讲到漏斗遮挡列表选择不同视图的实现是通过iCarousel来实现
但是,如果我们选择的是空的页面,显示的默认页面,怎么处理?
我们回到ProjectListView中,看到代码:
[weakSelf configBlankPage:blankPageType hasData:(weakSelf.myProjects.list.count > 0) hasError:(error != nil) reloadButtonBlock:^(id sender) {
[weakSelf refresh];
}];
这个就是配置默认页面的关键,可以在UIView+Common看到具体的实现:
- (void)configBlankPage:(EaseBlankPageType)blankPageType hasData:(BOOL)hasData hasError:(BOOL)hasError reloadButtonBlock:(void (^)(id))block{
if (hasData) {
if (self.blankPageView) {
self.blankPageView.hidden = YES;
[self.blankPageView removeFromSuperview];
}
}else{
if (!self.blankPageView) {
self.blankPageView = [[EaseBlankPageView alloc] initWithFrame:self.bounds];
}
self.blankPageView.hidden = NO;
[self.blankPageContainer addSubview:self.blankPageView];
// [self.blankPageContainer insertSubview:self.blankPageView atIndex:0];
// [self.blankPageView mas_makeConstraints:^(MASConstraintMaker *make) {
// make.size.equalTo(self);
// make.top.left.equalTo(self.blankPageContainer);
// }];
[self.blankPageView configWithType:blankPageType hasData:hasData hasError:hasError reloadButtonBlock:block];
}
}
这里的实现原理就是:
1.先通过 objc runtime 的 associate 让UIView类目拥有该属性变量
2.如果有数据,不操作,若无数据,则初始化EaseBlankPageView
3.配置blankPageView
注意点是,如果存在当前的页面是TableView的界面,需要将它添加在TableView上,所以需要遍历找到它
- (UIView *)blankPageContainer{
UIView *blankPageContainer = self;
for (UIView *aView in [self subviews]) {
if ([aView isKindOfClass:[UITableView class]]) {
blankPageContainer = aView;
}
}
return blankPageContainer;
}
配置blankPageView的操作就不多说了,主要是一些界面的设置,看看这个方法的实现即可
最后需要注意的是,如何实现调用这一part
我们看到这个属性:
@property(copy, nonatomic) void(^clickButtonBlock)(EaseBlankPageType curType);
在blankPageView类也存在这个属性,并且在sendRequest实现传递执行(实现):
//空白页按钮事件
self.blankPageView.clickButtonBlock=^(EaseBlankPageType curType) {
weakSelf.clickButtonBlock(curType);
};
而在Project_RootViewController调用ProjectListView处(具体在iCarousel 委托实现中) 回调实现操作:
listView.clickButtonBlock=^(EaseBlankPageType curType) {
switch (curType) {
case EaseBlankPageTypeProject_ALL:
case EaseBlankPageTypeProject_CREATE:
case EaseBlankPageTypeProject_JOIN:
[weakSelf goToNewProjectVC];
break;
case EaseBlankPageTypeProject_WATCHED:
case EaseBlankPageTypeProject_STARED:
[weakSelf goToProjectSquareVC];
break;
default:
break;
}
};
即在每次请求sendRequest操作都执行一次这个clickButtonBlock操作,这样就实现了每次更换iCarousel界面的效果!!