ios UITableView实现无数据加载占位图片

发布时间 - 2026-01-11 02:35:19    点击率:

本文介绍了ios UITableView实现无数据占位图片,分享给大家,具体如下:

国际惯例,上效果图

该效果的实现主要是使用runtime的交叉方法实现,将tableView的reloadData与自定义的kk_reloadData交换。新建tableView的Category。

交换方法主要代码

+ (void)swizzleInstanceSelector:(SEL)originalSel
      WithSwizzledSelector:(SEL)swizzledSel {

  Method originMethod = class_getInstanceMethod(self, originalSel);
  Method swizzedMehtod = class_getInstanceMethod(self, swizzledSel);
  BOOL methodAdded = class_addMethod(self, originalSel, method_getImplementation(swizzedMehtod), method_getTypeEncoding(swizzedMehtod));

  if (methodAdded) {
    class_replaceMethod(self, swizzledSel, method_getImplementation(originMethod), method_getTypeEncoding(originMethod));
  }else{
    method_exchangeImplementations(originMethod, swizzedMehtod);
  }
}

交换reloadData

+ (void)load {
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    [self swizzleInstanceSelector:@selector(reloadData) WithSwizzledSelector:@selector(kk_reloadData)];
  });
}

kk_reloadData方法,先检查是否有数据,再次kk_reloadData方法此时已使用runtime的交换方法则则实际上调用的是系统的reloadData方法。

- (void)kk_reloadData {
  [self kk_checkEmpty];
  [self kk_reloadData];
}

kk_checkEmpty方法

- (void)kk_checkEmpty {
  BOOL isEmpty = YES;
  id<UITableViewDataSource> src = self.dataSource;
  NSInteger sections = 1;
  if ([src respondsToSelector:@selector(numberOfSectionsInTableView:)]) {
    sections = [src numberOfSectionsInTableView:self];
  }
  for (int i = 0; i < sections; i++) {
    NSInteger rows = [src tableView:self numberOfRowsInSection:i];
    if (rows) {
      isEmpty = NO;
    }
  }
  if (isEmpty) {//数据为空,在这里添加视图
  }else{//数据不为空,在这里一处视图
  }
}

为了降低代码的侵入,可以给tableView动态添加一个View属性即是占位图视图。

@property (nonatomic, strong) UIView *placeHolderView;
- (void)setPlaceHolderView:(UIView *)placeHolderView {
  objc_setAssociatedObject(self, @selector(placeHolderView), placeHolderView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (UIView *)placeHolderView {
  return objc_getAssociatedObject(self, @selector(placeHolderView));
}

kk_checkEmpty的

if (isEmpty) {//数据为空,在这里添加视图
}else{//数据不为空,在这里一处视图
}

修改为

if (isEmpty) {
    [self.placeHolderView removeFromSuperview];
    [self addSubview:self.placeHolderView];
  }else{
    [self.placeHolderView removeFromSuperview];
  }

以后使用的时候只需设置tableView的placeHolderView属性即可

_tableView.placeHolderView = [[UIView alloc] init];

打完收工

github地址: https://github.com/wuzaozhou/UITableView-placeholder

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# ios  # 无数据占位图片  # 占位图片  # 数据加载占位  # IOS开发中加载大量网络图片优化方法  # iOS之加载Gif图片的方法  # ios通过SDWebImage实现图片加载时的渐变效果  # 如何在iOS中高效的加载图片详解  # 在这里  # 为空  # 一处  # 的是  # 只需  # 给大家  # 自定义  # 即是  # 打完  # 大家多多  # 主要是  # 无数据  # originMethod  # Method  # class_getInstanceMethod  # swizzedMehtod  # SEL  # swizzleInstanceSelector  # originalSel  # swizzledSel 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel事件监听器怎么写_Laravel Event和Listener使用教程  如何快速生成ASP一键建站模板并优化安全性?  网站图片在线制作软件,怎么在图片上做链接?  详解Android图表 MPAndroidChart折线图  5种Android数据存储方式汇总  如何确认建站备案号应放置的具体位置?  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  PythonWeb开发入门教程_Flask快速构建Web应用  油猴 教程,油猴搜脚本为什么会网页无法显示?  微信推文制作网站有哪些,怎么做微信推文,急?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  如何在阿里云部署织梦网站?  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  Laravel如何使用Blade模板引擎?(完整语法和示例)  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  三星网站视频制作教程下载,三星w23网页如何全屏?  如何快速生成凡客建站的专业级图册?  微信小程序 input输入框控件详解及实例(多种示例)  南京网站制作费用,南京远驱官方网站?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  如何在阿里云香港服务器快速搭建网站?  Mybatis 中的insertOrUpdate操作  智能起名网站制作软件有哪些,制作logo的软件?  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  移动端脚本框架Hammer.js  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  Laravel如何实现API资源集合?(Resource Collection教程)  javascript中对象的定义、使用以及对象和原型链操作小结  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Python制作简易注册登录系统  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  如何为不同团队 ID 动态生成多个非值班状态按钮  Android okhttputils现在进度显示实例代码  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  ,在苏州找工作,上哪个网站比较好?  如何用虚拟主机快速搭建网站?详细步骤解析  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  js实现获取鼠标当前的位置  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  b2c电商网站制作流程,b2c水平综合的电商平台?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  Laravel怎么上传文件_Laravel图片上传及存储配置  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  如何在阿里云购买域名并搭建网站?  php结合redis实现高并发下的抢购、秒杀功能的实例  如何在腾讯云服务器快速搭建个人网站?  创业网站制作流程,创业网站可靠吗?  黑客如何利用漏洞与弱口令入侵网站服务器?