UITableViewCell 作爲"UITableView"觀察者

應用場景 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];
        }
    }
}
發佈了49 篇原創文章 · 獲贊 28 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章