UITableViewCell 作为"UITableView"观察者
2015-10-23 12:58
375 查看
应用场景 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个方法
2.UIViewControll中控制UITableViewCell什么时候改注册观察者,什么时候该注销观察者
注册观察者: 为Cell设置数据的时候调用Cell的-(void)setObserva和-(void)setupObserva注册观察者
注销观察者:
(1)删除某一行Cell的时候
(2)注销某一行Cell的时候
(3)每一次刷新TableView之前
应用场景 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]; } } }
相关文章推荐
- C#中观察者模式的3种实现方式
- 浅谈Nodejs观察者模式
- C#设计模式之观察者模式实例讲解
- jQuery的观察者模式详解
- Android源码学习之观察者模式应用及优点介绍
- php设计模式之观察者模式的应用详解
- Python设计模式之观察者模式实例
- C#中委托和事件在观察者模式中的应用实例
- C++设计模式之观察者模式
- ruby、javascript、php中的观察者模式实现代码
- php中的观察者模式简单实例
- JavaScript设计模式之观察者模式(发布者-订阅者模式)
- C#中利用代理实现观察者设计模式详解
- Java中的观察者模式实例讲解
- Java设计模式之观察者模式(Observer模式)介绍
- Javascript设计模式之观察者模式的多个实现版本实例
- 设计模式——观察者模式(Observer)
- 【JS进阶1】arguments,caller,callee,call,apply概念
- 观察者模式之一
- java设计模式之观察者模式