您的位置:首页 > 产品设计 > UI/UE

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个方法

//传入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];
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  观察者模式