CodingNet - Learning - 15

来源:互联网 发布:第九交响曲 知乎 编辑:程序博客网 时间:2024/06/12 19:08

上面讲到漏斗遮挡列表选择不同视图的实现是通过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界面


0 0