• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

iOS:在调用 reloadRowsAtIndexPaths 时,didEndDisplayingCell 被调用了两次

[复制链接]
菜鸟教程小白 发表于 2022-12-11 19:59:16 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

每当我调用 reloadRowsAtIndexPaths 时; didEndDisplayingCell 方法被调用了两次。为什么会这样?

我已经实现了以下 UITableViewDelegate 和 UITableViewDataSource 的委托(delegate)方法:

  • - (NSInteger)tableViewUITableView *)tableView numberOfRowsInSectionNSInteger)section

  • - (UITableViewCell *)tableViewUITableView *)tableView cellForRowAtIndexPathNSIndexPath *)indexPath

  • - (void)tableViewUITableView *)tableView didEndDisplayingCellUITableViewCell *)cell forRowAtIndexPathNSIndexPath*)indexPath

我实现 didEndDisplayingCell 的原因是,我想分离 Firebase 监听器。

这是我在里面实现的 didEndDisplayingCell

- (void)tableViewUITableView *)tableView didEndDisplayingCellUITableViewCell *)cell forRowAtIndexPathNSIndexPath*)indexPath{
// detach the listener for the cell at path index indexPath

  CustomCell* customCell = (CustomCell*)(cell);
  [customCell detachListener]; 
}

每当单元格监听更新的数据时,它都会触发 ViewController 中的一个方法,该方法会重新加载 tableViewCell。以下是我实现该方法的方式:

-(void)refreshCellWithIndexPath:(NSIndexPath*) indexPath andData:(CustomData*)data{

  [self.dataArray replaceObjectAtIndex:indexPath.row withObject:data];

  [self.tableView beginUpdates];
  [self.tableView reloadRowsAtIndexPaths[indexPath] withRowAnimation:UITableViewRowAnimationFade];
  [self.tableView endUpdates];
}

此方法执行时,UITableView 的委托(delegate)方法按以下顺序调用:

  1. numberOfRowsInSection
  2. cellForRowAtIndexPath
  3. didEndDisplayingCell
  4. didEndDisplayingCell

为什么第二次调用这个 didEndDisplayingCell 方法?请帮我解决这个问题。



Best Answer-推荐答案


可能的解决方法:

代替

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];

使用(迅速):

reloadCounter += 1
CATransaction.begin()
tableView.beginUpdates()
CATransaction.setCompletionBlock {
    self.reloadCounter -= 1
}
tableView.reloadRows(at: [IndexPath(row: row, section: 0)], with: .none)
tableView.endUpdates()
CATransaction.commit()

reloadCounter 是一个 ivar。

在 didEndDisplaying 中:

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if (reloadCounter == 0) {
        self.output.didEndDisplaying(viewModel: dataProvider.items[indexPath.row])
    }
}

关于iOS:在调用 reloadRowsAtIndexPaths 时,didEndDisplayingCell 被调用了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44788055/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap