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]; } }}
- UITableViewCell 作为"UITableView"观察者
- UITableView&UITableViewCell
- UITableView,UITableViewCell,UIPickerView,UISearchBar
- UITableView与UITableViewCell
- UITableView与UITableViewCell
- UITableView UITableViewCell NSIndexPath
- UITableView,UITableViewCell,UIPickerView,UISearchBar
- UITableView,UITableViewCell,UIPickerView
- UITableView,UITableViewCell,UIPickerView
- UITableView与UITableViewCell
- UITableView自定义UITableViewCell
- UITableView与UITableViewCell
- UITableView 自定义UITableViewCell
- UITableView,自定义UITableViewCell
- UITableView与UITableViewCell
- UITableView与UITableViewCell
- UITableView,UIScrollView,UITableViewCell
- UITableView 系列: 自定义 UITableViewCell
- Python-PyCharm安装numpy和matplotlib
- 极光推送技术原理:移动无线网络长连接
- vs2010 调试 改变程序的执行路径 显示下一语句
- Perf Event :Linux下的系统性能调优工具
- 第一个wp app上架-- owl Mpcrc
- UITableViewCell 作为"UITableView"观察者
- easyui分页实现的原理
- fedora下安装build-essential
- 基于51单片机SJA1000 CAN通讯实现(C语言程序)
- jQuery旋转插件—rotate
- 2015中国互联网百强企业
- Tomcat部署Web应用方法总结
- AndroidManifest.xml文件详解(activity)(五)
- LeetCode(150) Evaluate Reverse Polish Notation