一般 UITableView 在 loading 数据的时候要展示一个 loading,在没有数据的时候要展示一个 placeholder(比如『您还没有收藏 xxxx』之类的)。想问下大家,这种东西怎么设计比较好呢?
有几个需要考虑的问题:
最好是能做得比较通用,不同 tableView 用起来要重复写的代码较少;最好 UITableView 和 UICollectionView 能用一套
可能需要接收点击事件
我感觉最难的一个问题时,有时会出现用 tab 切换 dataSource 的情况,这几个 dataSource 是共用一个 placeholder 还是分别持有一个 placeholder 呢?并且还需要考虑一个 dataSource 用在数个地方的情况(比如 公共的 xxx 列表和 用户收藏的 xxx 列表,cell都一样,但 placeholder 可能会不一样)
我现在能想到几种方法,都看到有某些 app 在使用的例子。
把 placeholder 放在底层,tableView 放在上层,然后 tableView 在没有数据时的 backgroundColor 设成透明,有数据时设成不透明。这样透明的时候就自然把底下的 placeholder 透出来了。
缺点:不能接收点击事件。把 placeholder 设为 tableView footer 或 tableView cell
缺点:tableView 和 collectionView 没法用同一个 cell。另外,如果用 footer 的话 collectionView 不太方便,用 cell 的话每个 tableView 的 cellForRow、heightForRow 里面都得加这种特殊情况处理 cell 的代码,会有大量重复代码,没法做得很通用。一个单独的 view 盖在 tableView 上面
好像较少看到有这么做的。
今天看了一下才发现不少 app 在这个地方是做得很不好的,比如随便看了下小红书,单用户那儿的 placeholder 就有好多种,实现方法也可以猜出是五花八门(有些跟着 tableView 一起滚,有些不跟着滚,有些可以看出是在 tableView 下一层的)。
抛砖引玉,想问问大家对这个问题是怎么做的?~ 有没有什么好的经验可以分享呢?谢谢!
可以参考一下
感觉这个更适合你
之前看到别人写的
https://github.com/ChenYilong/CYLTableViewPlaceHolder
http://www.jianshu.com/p/e39699b0d134
另外可以将 placeHolder 设置为 tableView 的 backgroundView 嘛?
这个不是最简单咩?
不过我的做法是,因为是使用 MJRefresh
在加载时,头部就会有加载提示,加载完提示会自动消失
也算是比较偷懒的
做法1可以改成**没有数据的时候bringSubviewToFront
把placeholder
移到最上层。
做法3没有数据的时候隐藏那个placeholder
。
个人用的做法3,这样placeholder
可以上下滚动
把所有的vc继承一个带以下所有状态的view的vc,给model设置一个state状态,开始请求的时候busy,请求结束free,然后去choose哪个是你要的状态来显示界面。
- (void)chooseView {
//// 显示正常页面
if ([self.model itemCount]) {
[self showRightView];
return;
}
//// 显示加载页面
if (self.model.modelState == YZModelState_Busy) {
[self showLoadingView];
return;
}
//// 显示空页面
if (self.model.modelState == YZModelState_Free &&
![self.model itemCount])
{
[self showEmptyView];
return;
}
// 显示出错或者空页面
[self showErrorView];
}