我们继续到下一个页面:
接下来聚焦到这个页面,首先从我们关心的TableView和Cell开始入手
Cell的界面实现没有什么难度。
用到一个轮子:SWTableViewCell , 可以实现删除的一个很好的效果
点击设置常用,添加了一个pin的效果是怎么实现的呢?
刚开始想了很久,想过直接在ImageView上添加绘图的badgeView,或者甚至请求服务器返回哈哈,让服务器帮你添加
不过实现却是比较普通的,在ContentView上添加一个badgeView
[self.contentView addBadgeTip:badgeTip withCenterPosition:CGPointMake(10+kProjectListCell_IconHeight, 15)];
接下来我们从刷新的角度来剖析实现:
首先下拉刷新用到的几个三方库:
SVPullToRefresh
ODRefreshControl
分别有三个行为会调起刷新的行为:
1.点击tabBarItems项
2.下拉tableView
3.从别视图控制器回到该视图控制器
1.点击tabBarItems项:
记得前面的基类控制器:BaseViewController 的方法:
- (void)tabBarItemClicked;
而在Project_RootViewController中我们重写这个方法:
- (void)tabBarItemClicked{
[super tabBarItemClicked];
if (_myCarousel.currentItemView && [_myCarousel.currentItemView isKindOfClass:[ProjectListView class]]) {
ProjectListView *listView = (ProjectListView *)_myCarousel.currentItemView;
[listView tabBarItemClicked];
}
}
在ProjectListView 实现:
- (void)tabBarItemClicked{
if (_myTableView.contentOffset.y > 0) {
[_myTableView setContentOffset:CGPointZero animated:YES];
}else if (!self.myRefreshControl.isAnimating){
[self.myRefreshControl beginRefreshing];
[self.myTableView setContentOffset:CGPointMake(0, -44)];
[self refresh];
}
}
这样逐层传递这样就可以调用刷新方法了
第二三的方法就不多说了,就是简单的调用和适当嵌套
而我们要讲的是,这么多个刷新方法,都调用到同一个操作,sendRequest:
- (void)refreshUI{
[_myTableView reloadData];
[self refreshFirst];
}
- (void)refreshToQueryData{
[self refresh];
}
- (void)refresh{
// _statusView.hidden=TRUE;
NSString *headerTitle=[self getSectionHeaderName];
if (headerTitle.length>0) {
self.noticeLab.text=headerTitle;
self.statusView.hidden=FALSE;
}
if (_myProjects.isLoading) {
return;
}
[self sendRequest];
}
- (void)refreshFirst{
if (_myProjects && !_myProjects.list) {
[self performSelector:@selector(refresh) withObject:nil afterDelay:0.3];
}
}
- (void)refreshMore{
if (_myProjects.isLoading || !_myProjects.canLoadMore) {
[_myTableView.infiniteScrollingView stopAnimating];
return;
}
_myProjects.willLoadMore = YES;
[self sendRequest];
}
最重要的如何理解这个sendRequest做了什么,不妨现在网络可用的情况下操作三种刷新,并输出后台,然后在网络不可用的情况下刷新并输出后台。可以看到,每一次刷新都要请求服务器,所以还是最重要的部分在网络库的封装是否合理,高效。
而网络库的封装是否合理在于和本地缓存的实现方案是否严谨,高效!