UITableViewCell 作为"UITableView"观察者

应用场景 1:点击TableViewCell可触发一个动画使其进入另一种形态(enable),但TableView不能同时存在两个enable的Cell,这就意味着,当一个新的Cell状态变成enable的时候,其他Cell要自动恢复到初始化状态(unable)

应用场景 2:点击TableViewCell上的一个button使Cell进入另一种状态,再点击该button恢复到初始化状态,那么如果我点击button进入另一种状态后,却没有再次点击使其恢复到初始化状态,我希望当我滑动TableView时所有Cell自动恢复到初始化状态,该怎么做呢

难点:注册成为TableView观察者并不难,难就难在,观察者是TableViewCell,使用观察者模式需要考虑的一个重点:注销观察者!你只需要记住一点:【Cell消失时、Cell注销时、Cell被删除时】都需要注销观察者,简而言之,只要Cell在当前屏幕上不可见时,都需要注销观察者!如果注册了观察者而没有及时注销,当你滑动TableView的时候整个App就会挂掉。

注册观察者:【初始化UITableViewCell的时候】
注销观察者:【Cell消失时、Cell注销时、Cell被删除时】< – – – 重点

1.UITableViewCell中准备好3个方法

//传入UITableView
- (void)setObserva:(UIScrollView *)scrollView {
    _scrollView = scrollView;
}

//注册
- (void)setupObserva {
    _isObserver = YES;
    [_scrollView addObserver:self
                  forKeyPath:@"contentOffset"
                     options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
                     context:(__bridge void * )(_scrollView)];
}

//注销
- (void)unregisterForChangeNotification {
    if(_isObserver){
        _isObserver = NO;
    [_scrollView removeObserver:self forKeyPath:@"contentOffset"];
    }
}

2.UIViewControll中控制UITableViewCell什么时候改注册观察者,什么时候该注销观察者

注册观察者: 为Cell设置数据的时候调用Cell的-(void)setObserva和-(void)setupObserva注册观察者

注销观察者:
(1)删除某一行Cell的时候

[cell unregisterForChangeNotification];
[_tableData removeObjectAtIndex:indexPath.row];
[_mTableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

(2)注销某一行Cell的时候

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath  {
    if(indexPath.section == 1) {
        [(PostsDetailCommentCell*)cell unregisterForChangeNotification];
    }
}

(3)每一次刷新TableView之前

//要写在reloadData之前
[self removeobserverInTabCell];
            [_mTableView reloadData];

//刷新数据之前,先注销所有当前已经注册了观察者的Cell
- (void)removeobserverInTabCell {
    if(_tableData && _tableData.count > 0) {
        for(int i=0; i<_tableData.count; i++) {
            NSIndexPath *index = [NSIndexPath indexPathForRow:i inSection:1];
            PostsDetailCommentCell *cell = [_mTableView cellForRowAtIndexPath:index];
            [cell unregisterForChangeNotification];
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值