tableView空数据问题

一般项目中tableView若数据为空时会有一个提示示意图

为了更好的管理这种提示示意图,笔者利用extension进行了简单的拓展

解决思路

利用swift面向协议的特点,使用协议来进行设置。

  • 设计空视图协议
  • tableView设置空视图代理
  • 每次重绘tableView时判断添加或移除空数据提示图

具体实现

  • 空视图协议,遵守协议必须实现showEmtpy属性
private let EmptyViewTag = 12345;

protocol EmptyViewProtocol: NSObjectProtocol {

    ///用以判断是会否显示空视图
var showEmtpy: Bool {get} ///配置空数据提示图用于展示
func configEmptyView() -> UIView?
} extension EmptyViewProtocol { func configEmptyView() -> UIView? {
return nil
}
}
  • tableView扩展配置,实现空数据示意图展示判断

DispatchQueue.once和BQTool.exchangeMethod是只执行一次方法交换操作,具体实现可看源码

    func setEmtpyViewDelegate(target: EmptyViewProtocol) {
self.emptyDelegate = target
DispatchQueue.once(#function) {
BQTool.exchangeMethod(cls: self.classForCoder, targetSel: #selector(self.layoutSubviews), newSel: #selector(self.re_layoutSubviews))
}
} @objc func re_layoutSubviews() {
self.re_layoutSubviews() if self.emptyDelegate!.showEmtpy { guard let view = self.emptyDelegate?.configEmptyView() else {
return;
} if let subView = self.viewWithTag(EmptyViewTag) {
subView.removeFromSuperview()
} view.tag = EmptyViewTag;
self.addSubview(view) } else { guard let view = self.viewWithTag(EmptyViewTag) else {
return;
}
view .removeFromSuperview()
}
} //MARK:- ***** Associated Object *****
private struct AssociatedKeys {
static var emptyViewDelegate = "tableView_emptyViewDelegate"
} private var emptyDelegate: EmptyViewProtocol? {
get {
return (objc_getAssociatedObject(self, &AssociatedKeys.emptyViewDelegate) as! EmptyViewProtocol)
}
set (newValue){
objc_setAssociatedObject(self, &AssociatedKeys.emptyViewDelegate, newValue!, .OBJC_ASSOCIATION_RETAIN)
}
}

示例代码

//关键部分代码
class ViewController: UIViewController , EmptyViewProtocol { private var datas: Array<Dictionary<String, String>>?
/// 空数据提示图
private var label: UILabel? var showEmtpy: Bool {
get {
if let data = self.datas {
return data.count == 0
}
return true
}
} override func viewDidLoad() {
super.viewDidLoad() let tableView: UITableView = ...
tableView.setEmtpyViewDelegate(target: self)
self.view.addSubview(tableView)
} func configEmptyView() -> UIView? { if let view = self.label {
return view
} let lab = UILabel(frame: CGRect(x: 100, y: 300, width: 200, height: 30))
lab.text = "this is a test"
lab.textAlignment = .center
self.label = lab return lab
}
}

效果图如下

最后

  • 该设计较为简单方便管理,若有不妥之处望指出
  • 相关代码请前往swiftCustomControl查看

Swift几行代码解决UITableView空数据视图问题的更多相关文章

  1. 代码优化实战,3行代码解决了一百个if else!

    事情是这样的,前段时间做代码review的时候,发现项目中有一个方法代码量超鸡儿多,而且大部分都是写的参数校验的代码,得,我们先抓着缕一缕需求先. 产品需求 找到产品要到了需求文档,需求是这样得: e ...

  2. Python-10行代码实现3个数据可视化

    阅读本文约“1分钟” 最近将Python作为第二编程语言,进行了了解与学习,可以说它的包是很强大的.这次的demo仅仅不到10行代码就可以实现三个数据可视化的小实例. 我们将要使用到matplotli ...

  3. Jquery几行代码解决跟随屏幕滚动DIV

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 7行代码解决P1441砝码称重(附优化过程)

    先贴上最终代码感受一下: #include <bits/stdc++.h> using namespace std; int i, N, M, wi[21], res = 0; int m ...

  5. Asp.Net Core-几行代码解决Razor中的嵌套if语句

    MVC开发中,经常会遇到在razor中插入简单的逻辑判断. @if (clientManager.IsAdmin) { if (!Model.Topic.Top) { <a asp-action ...

  6. 6行代码解决golang TCP粘包

    转自:https://studygolang.com/articles/12483 什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论.本文使用golang的bufio.Scanner来实现 ...

  7. 八行代码解决八皇后问题(c++)

    说的有点夸装,实际上并不只是巴航代码,加上前面的变量声明之类的一共有40多行的样子吧,好像是在知乎上看到的,现在有时间再把它写下来: 其中用到了一些c++11特性,例如lambda 以及给予范围的 f ...

  8. 17行代码解决微信小程序图片延迟加载

    js 页面 Page({ data: { realScrollTop: 0,//页面滚动距离 driveHeight //屏幕高度可初始化设置 }, scroll(e){ if(e.detail.sc ...

  9. 『零行代码』解决键盘遮挡问题(iOS)

    关注仓库,及时获得更新:iOS-Source-Code-Analyze https://github.com/draveness/iOS-Source-Code-Analyze Follow: Dra ...

随机推荐

  1. 【JVM】java方法区

    java方法区[名词解析]        --->和java堆一样,方法区是一块所有线程共享的内存区域.        --->保存系统的类信息,比如,类的字段,方法,常量池等.      ...

  2. ACM学习历程—UESTC 1219 Ba Gua Zhen(dfs && 独立回路 && xor高斯消元)

    题目链接:http://acm.uestc.edu.cn/#/problem/show/1219 题目大意是给了一张图,然后要求一个点通过路径回到这个点,使得xor和最大. 这是CCPC南阳站的一道题 ...

  3. RTSP协议分析(二)

    以下是某省IPTV的RTSP协商过程: DESCRIBE rtsp://118.122.89.27:554/live/ch10083121594790060557.sdp?playtype=1& ...

  4. BZOJ2288:[POJ Challenge]生日礼物

    浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...

  5. AI-Info-Micron-Menu:About Micron

    ylbtech-AI-Info-Micron-Menu:About Micron 将数据带入生活 美光科技的存储技术帮助将海量数据化为宝贵见解,重新定义世界使用信息的方式. 1.返回顶部 1. 公司简 ...

  6. 二 kafka设计原理

    kafka的设计初衷是希望作为一个统一的信息收集平台,能够实时的收集反馈信息,并需要能够支撑较大的数据量,且具备良好的容错能力. 1.持久性     kafka使用文件存储消息,这就直接决定kafka ...

  7. 使用root直接安装python3.5.2

    操作系统:Centos7.4 不使用pyenv管理器直接进行编译安装3.5.2版本. 下载tgz的包,如果没有安装wget,请yum -y install wget 解压python包: 将解压后的包 ...

  8. java基础知识(11)---多线程

    多线程: 进程:正在进行中的程序.其实进程就是一个应用程序运行时的内存分配空间. 线程:其实就是进程中一个程序执行控制单元,一条执行路径.进程负责的是应用程序的空间的标示.线程负责的是应用程序的执行顺 ...

  9. Windchill 基本业务对象

    容器容器是Windchill对象存放的地方:在Windchill中主要的容器有站点.组织.产品.存储库.项目.在Windchill中所有容器对象的父类为wt.inf.container.WTConta ...

  10. 拍照选择图片(Activity底部弹出)

    效果图如下: 第一步 : 显示出的布局文件:alert_dialog.xml <?xml version="1.0" encoding="utf-8"?& ...