UITableView数据更新问题

简介:
  • 自身遇到问题
  • 拓展-进行增删数据时的注意点

    • beginUpdates方法和endUpdates方法是什么呢?
    • 一般什么时候使用这么一个动画块呢?

      • 插入指定的行
      • 插入分组到制定位置
      • 删除制定位置的分组
      • 移动分组
  • 问答区

自身遇到问题

今天在设计自定义UITableViewCell的时候遇到一个愚蠢的问题,就是当用户在Cell上面使用自定义按钮触发删除时,为了保证删除时有动画效果,所以不能在执行deleteRowsAtIndexPaths: withRowAnimation:之后手动执行reloadData
这样就有一个问题,由于不执行reloadData,我们需要获取到Cell最新的indexPath就遇到问题

解决方案:
通过获取按钮所在的Cell的indexPath解决

方式一:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    AMDeleteCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];

    [cell setDeleteBlock:^(NSDictionary *dic, AMDeleteCell *cell) {
  
        //UITableViewCellContentView
        UIView *v = [sender superview];
    
        //UITableViewCell
        UITableViewCell *cell = (UITableViewCell*)[v superview];
        NSIndexPath *indexPath = [tableView indexPathForCell:cell];
        self.deleteIndexPath = indexPath;

    }];

    return cell;

}

方式二(个人认为比较好的一种方式):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    AMDeleteCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];

    [cell setDeleteBlock:^(NSDictionary *dic, AMDeleteCell *cell) {

        NSIndexPath *indexPath = [tableView indexPathForCell:cell];

        self.deleteIndexPath = indexPath;

    }];

    return cell;

}

自定义Cell内部部分代码:


#import "AMDeleteCell.h"

typedef void(^DeleteCellBlock)(NSDictionary *dic, AMDeleteCell *cell);

@interface AMDeleteCell ()

@property (strong, nonatomic) UIButton        *deleteBtn;
@property (strong, nonatomic) NSDictionary    *dataDic;
@property (copy, nonatomic  ) DeleteCellBlock block;

@end

@implementation AMDeleteCell

//…省略部分代码...

- (void)setDeleteBlock:(void (^)(NSDictionary *, AMDeleteCell *))block {
    self.block = block;
}

#pragma mark - Cell上面按钮触发的方法

- (void)deleteAction:(UIButton *)sender {
    if (_block) {
        _block(_dataDic, self);
    }
}

//...省略部分代码...

@end

拓展-进行增删数据时的注意点

1、普通形式(UITableViewStylePlain)数据增删

将tableView进行增删时需要先更新数据源,然后再执行delete/insert操作

2、分组形式(UITableViewStyleGrouped)数据增删

如果我们的UITableView是UITableViewStyleGrouped的时候,我们如果删除某个Group的最后一条记录时,相应的分组也将被删除。所以,必须保证UITableView的分组,和Cell同时被删除。所以,就需要使用beginUpdates方法和endUpdates方法,将要做的删除操作“包”起来!

beginUpdates方法和endUpdates方法是什么呢?

  1. 这两个方法,是配合起来使用的,标记了一个tableView的动画块。
  2. 分别代表动画的开始和结束。两者成对出现,可以嵌套使用。
  3. 一般,在添加删除选择tableView中使用,并实现动画效果。
  4. 在动画块内,不建议使用reloadData方法,如果使用,会影响动画

一般什么时候使用这么一个动画块呢?

一般在UITableView执行:删除行插入行删除分组插入分组时使用!用来协调UITableView的动画效果。

插入指定的行

在执行该方法时,会对数据源进行访问(分组数据和行数据),并更新可见行。所以,在调用该方法前,应该先更新数据源

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths
              withRowAnimation:(UITableViewRowAnimation)animation

插入分组到制定位置

插入一个特定的分组。如果,指定的位置上已经存在了分组,那么原来的分组向后移动一个位置。

- (void)insertSections:(NSIndexSet *)sections
      withRowAnimation:(UITableViewRowAnimation)animation

删除制定位置的分组

删除一个制定位置的分组,其后面的分组向前移动一个位置。

- (void)deleteSections:(NSIndexSet *)sections
      withRowAnimation:(UITableViewRowAnimation)animation

移动分组

移动原来的分组从一个位置移动到一个新的位置。如果,新位置上若存在某个分组,那这某个分组将会向上(下)移动到临近一个位置。该方法,没有动画参数。会直接移动。并且一次只能移动一个分组。

- (void)moveSection:(NSInteger)section
          toSection:(NSInteger)newSection

在如上方法中,建议使用该动画块进行操作!


问答区

  1. 为什么block属性使用copy修饰?
    答:Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的。ARC和非ARC声明都是一样的,当然注意在非ARC下要release Block。

再一次感谢您花费时间阅读这篇文章!

微博: @Danny_吕昌辉
博客: SuperDanny

目录
相关文章
|
Apache PHP 数据安全/隐私保护
(MAC)PHP Apache 安装与配置
(MAC)PHP Apache 安装与配置
534 0
|
JavaScript 前端开发
vue3 判断变量值是否为数字
vue3 判断变量值是否为数字
1135 0
|
安全 应用服务中间件 网络安全
VM tomcat启动成功,但是访问不到tomcat欢迎页
VM tomcat启动成功,但是访问不到tomcat欢迎页
700 0
VM tomcat启动成功,但是访问不到tomcat欢迎页
|
设计模式 算法 搜索推荐
后端开发中的设计模式应用与实践
在软件开发的广袤天地中,后端技术如同构筑高楼大厦的钢筋水泥,支撑起整个应用程序的骨架。本文旨在通过深入浅出的方式,探讨后端开发领域内不可或缺的设计模式,这些模式犹如精雕细琢的工具箱,能够助力开发者打造出既健壮又灵活的系统架构。从单例模式到工厂模式,从观察者模式到策略模式,每一种设计模式都蕴含着深刻的哲理与实践价值,它们不仅仅是代码的组织方式,更是解决复杂问题的智慧结晶。
|
12月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
223 1
|
SQL 关系型数据库 MySQL
如何查看SQL字符编码:详细技巧与方法
在SQL数据库管理中,字符编码对于确保数据的正确性和一致性至关重要
1214 5
|
关系型数据库 MySQL 网络安全
MySQL主从复制详细教程
配置MySQL的主从复制是一个细致的过程,需要仔细遵循上述步骤进行。一旦配置完成并运行正常,主从复制将大大提高数据库的可用性和读写性能。在操作过程中,务必保持谨慎,确保数据的一致性和安全性。
1026 0
|
Java
【JAVA】变量的作用域与生存周期
【JAVA】变量的作用域与生存周期
353 1
|
Linux 网络安全 Apache
使用树莓派搭建个人网站,并发布到外网可访问:实用步骤解析
使用树莓派搭建个人网站,并发布到外网可访问:实用步骤解析
459 0
|
存储 安全 JavaScript
XSS--概念、类型、实战--分析与详解[pikachu]
XSS--概念、类型、实战--分析与详解[pikachu]
1015 0