tableView空数据问题

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

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

解决思路

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

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

具体实现

  • 空视图协议,遵守协议必须实现showEmtpy属性
  1. private let EmptyViewTag = 12345;
  2. protocol EmptyViewProtocol: NSObjectProtocol {
  3. ///用以判断是会否显示空视图
  4. var showEmtpy: Bool {get}
  5. ///配置空数据提示图用于展示
  6. func configEmptyView() -> UIView?
  7. }
  8. extension EmptyViewProtocol {
  9. func configEmptyView() -> UIView? {
  10. return nil
  11. }
  12. }
  • tableView扩展配置,实现空数据示意图展示判断

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

  1. func setEmtpyViewDelegate(target: EmptyViewProtocol) {
  2. self.emptyDelegate = target
  3. DispatchQueue.once(#function) {
  4. BQTool.exchangeMethod(cls: self.classForCoder, targetSel: #selector(self.layoutSubviews), newSel: #selector(self.re_layoutSubviews))
  5. }
  6. }
  7. @objc func re_layoutSubviews() {
  8. self.re_layoutSubviews()
  9. if self.emptyDelegate!.showEmtpy {
  10. guard let view = self.emptyDelegate?.configEmptyView() else {
  11. return;
  12. }
  13. if let subView = self.viewWithTag(EmptyViewTag) {
  14. subView.removeFromSuperview()
  15. }
  16. view.tag = EmptyViewTag;
  17. self.addSubview(view)
  18. } else {
  19. guard let view = self.viewWithTag(EmptyViewTag) else {
  20. return;
  21. }
  22. view .removeFromSuperview()
  23. }
  24. }
  25. //MARK:- ***** Associated Object *****
  26. private struct AssociatedKeys {
  27. static var emptyViewDelegate = "tableView_emptyViewDelegate"
  28. }
  29. private var emptyDelegate: EmptyViewProtocol? {
  30. get {
  31. return (objc_getAssociatedObject(self, &AssociatedKeys.emptyViewDelegate) as! EmptyViewProtocol)
  32. }
  33. set (newValue){
  34. objc_setAssociatedObject(self, &AssociatedKeys.emptyViewDelegate, newValue!, .OBJC_ASSOCIATION_RETAIN)
  35. }
  36. }

示例代码

  1. //关键部分代码
  2. class ViewController: UIViewController , EmptyViewProtocol {
  3. private var datas: Array<Dictionary<String, String>>?
  4. /// 空数据提示图
  5. private var label: UILabel?
  6. var showEmtpy: Bool {
  7. get {
  8. if let data = self.datas {
  9. return data.count == 0
  10. }
  11. return true
  12. }
  13. }
  14. override func viewDidLoad() {
  15. super.viewDidLoad()
  16. let tableView: UITableView = ...
  17. tableView.setEmtpyViewDelegate(target: self)
  18. self.view.addSubview(tableView)
  19. }
  20. func configEmptyView() -> UIView? {
  21. if let view = self.label {
  22. return view
  23. }
  24. let lab = UILabel(frame: CGRect(x: 100, y: 300, width: 200, height: 30))
  25. lab.text = "this is a test"
  26. lab.textAlignment = .center
  27. self.label = lab
  28. return lab
  29. }
  30. }

效果图如下

最后

  • 该设计较为简单方便管理,若有不妥之处望指出
  • 相关代码请前往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. IP通信中音频编解码技术与抗丢包技术概要

    此文较长,建议收藏起来看. 一.一个典型的IP通信模型 二.Server2Server技术分类 Server2Server这块也是一个专门的领域,这里只简单分个类. 1.同一国家相同运营商之间: 同一 ...

  2. 用nginx搭建http/rtmp/hls协议的MP4/FLV流媒体服务器

    前前后后搭建了两三个星期,终于可以告一段落,nginx实在是有点强大.写一篇笔记来记录一下这个过程中的思路和解决方案. 一.搭建nginx平台: 基本是基于http://blog.csdn.net/x ...

  3. P2056 采花

    题目描述 萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 1-c 表示) ,且花是排成 ...

  4. 洛谷 P2149 [SDOI2009]Elaxia的路线

    题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的 ...

  5. Eclipse或MyEclipse中给第三方jar包添加源码步骤

    0.目的 向web项目中添加mybatis源码. 1.项目结构如下 将mybatis的jar包添加到工程中 2.解压下载的mybatis压缩包(下载地址 https://github.com/myba ...

  6. Poj 1019 Number Sequence( 数据分析和操作)

    一.题目大意 有这样一个序列包含S1,S2,S3...SK,每一个Si包括整数1到 i.求在这个序列中给定的整数n为下标的数. 例如,前80位为1121231234123451234561234567 ...

  7. Poj2656(水题)

    一.Description Jinjin is a junior school student. Besides the classes in school, Jinjin's mother also ...

  8. MongoDB优化之三:如何排查MongoDB CPU利用率高的问题

    遇到这个问题,99.9999% 的可能性是「用户使用上不合理导致」,本文主要介绍从应用的角度如何排查 MongoDB CPU 利用率高的问题. Step1: 分析数据库正在执行的请求 用户可以通过 M ...

  9. nginx的安装及基本配置

    在CentOS7(mini)上安装: [root@~ localhost]#lftp 172.16.0.1 lftp 172.16.0.1:/pub/Sources/7.x86_64/nginx> ...

  10. 【总结整理】overflow: auto/hidden;清除自己

    .top-nav{ font-size: 12px; font-weight: bold; list-style-type: none; border-bottom: 8px solid #DC4E1 ...