應用場景 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];
}
}
}