自定义tableViewCell按钮状态改变的问题

发布于 2022-09-01 13:12:56 字数 693 浏览 18 评论 0

RT,自定义了一个tabelViewCell,里面放了个button,设置了按钮选中和未选中状态的背景图片,然后想要实现点击这个cell的时候就改变按钮的点击状态,

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  //获得点击的cell
  MyCarCell *cell = (MyCarCell *)[self.tableView
      cellForRowAtIndexPath:[NSIndexPath indexPathForRow:indexPath.row
                                               inSection:indexPath.section]];
  //这里设置按钮的选中状态
  cell.isSeletc = !cell.isSeletc;
  //刷新cell
  [self.tableView reloadRowsAtIndexPaths:@[
    [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section]
  ] withRowAnimation:UITableViewRowAnimationNone];
}

点击的时候按钮只是改变了一下状态然后马上恢复原状了,求解

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

嘴硬脾气大 2022-09-08 13:12:56

问题分析

cell.isSeletc = !cell.isSeletc;应该设置了按钮的状态更新了UI吧?
紧接着你调用了

  [self.tableView reloadRowsAtIndexPaths:@[
    [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section]
  ] withRowAnimation:UITableViewRowAnimationNone];

这样UITableView会回调tableView:cellForRowAtIndexPath:方法去更新cell。如果在这个方法中,你没有设置cell.isSeletc,或者把cell.isSeletc设置为默认值,就会看到你现在看到的效果,闪一下就恢复回去了。

解决

有一个减少大部分这种错误的编程思路,将所有会改变cell的UI变化的设置都放在tableView:cellForRowAtIndexPath:中。其它触发的地方只设置UI变化的状态,不去更新UI。设置好状态以后,使用reloadRowsAtIndexPaths:withRowAnimation:刷新对应的cell。这样既可以解决你现在的问题,也可以很容易的避免cell重用时,经常会碰到的显示错误的BUG。
像本题的例子,[cell setIsSeletc:]中,不要去刷新UI,保存只这个BOOL值,而UI的更新放在tableView:cellForRowAtIndexPath:中完成。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文