UITableViewCell 作为"UITableView"观察者

来源:互联网 发布:淘宝女装店名推荐 编辑:程序博客网 时间:2024/06/05 14:38

应用场景 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
原创粉丝点击