2011-08-21 124 views
7

我有一個UITableView與沉重的圖像內容。所以滾動不再流暢。 我想添加一個定時器來加載圖像,而你滾動我創建每行的計時器。如果細胞退出視野,我取消定時器。如果不是,我淡入圖像。UITableView單元剛剛消失回調?

我的問題是:是否有一個回調細胞走出視野?我正在閱讀文檔,但我不確定是否有任何需求。

感謝您的幫助!編輯:我使用的代碼(這是three20圖書館,我使用自定義TTTableItemCell。「_tabBar1.tabItems = item.photos」是線hoging資源。在第一次加載它是好的,因爲這些照片是從服務器異步加載,但是當我回滾動或重裝的觀點,他們都裝同步,並滾動不順暢了,尤其是在iPhone 3G:

- (void)setObject:(id)object { 
    if (_item != object) { 
     [super setObject:object]; 

     Mission* item = object; 

     self.textLabel.text = item.name; 
     _tabBar1.tabItems = nil; 

     timerFeats = [NSTimer scheduledTimerWithTimeInterval:(0.5f) target:self selector:@selector(updateFeats) userInfo:nil repeats: NO]; 
     //_tabBar1.tabItems = item.photos; 
    } 
} 

-(void)updateFeats { 
    DLog(@"timer ended"); 
    Mission* item = self.object; 
    self._tabBar1.tabItems = item.photos; 
} 

回答

5

好吧,我找到了一種方法。

實際上有一個回調,知道細胞即將離開視野。 :

- (void)willMoveToSuperview:(UIView *)newSuperview; 

所以我的代碼是:

- (void)willMoveToSuperview:(UIView *)newSuperview { 
    [super willMoveToSuperview:newSuperview]; 
    if(!newSuperview) { 
     DLog(@"timer invalidated"); 
     if ([timerFeats isValid]) { 
      [timerFeats invalidate]; 
     } 

    } 
} 

如果沒有newSuperview細胞是走出去的看法,所以我首先驗證我的定時器尚未失效,然後我取消它。

+1

這個方法似乎在一個單元格出現* *以查看 – Matthew

+1

@Matt作爲iOS 7.02時就會觸發,當您向外滾動單元格並將其向回滾動時,可能根本不會調用此方法。但是,不久它就會再次顯示prepareForReuse方法。在不可見的時間內,只有隱藏標誌爲TRUE,但仍然附加到tableview。所以沒有改變超視圖。 – Klaas

0

當一個UITableView最初顯示它調用此方法每行一次

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath 

之後,當需要新行時通常會調用該方法,這通常是滾動顯示新行並將舊視圖從另一端推開的結果。

因此,這是找出哪些行可見的理想鉤子。要檢查哪些細胞是可見的,你可以調用

- (NSArray *)indexPathsForVisibleRows 

因爲實現代碼如下是抱着你的單元格的引用它們被回收或新鮮creaetd你不能讓這些計時器的句柄之前的唯一的事。我的建議是建立一個NSMutableDictionary伊娃,當你創建你的細胞計時器添加到NSMutableDictionary

[timersForIndexs setObject:yourTimer forKey:indexPath]; 

現在,當您收到- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath你需要做的是這樣

NSMutableDictionary *tmpDictionary = [timersForIndexs copy]; 

[tmpDictionary removeObjectsForKeys:[self.tableView indexPathsForVisibleRows]]; 

NSArray *timers = [tmpDictionary allKeys]; 

[timers makeObjectsPerformSelector:@selector(invalidate)]; 

我不是所以這是乾的代碼,所以請讓我知道,如果您有任何問題

+0

我想,但顯然,如果我使用[tableView cellForRowAtIndexPath:indexToRemove]不可見的單元格,我得到一個null,所以我不能取消我的計時器。 – rnaud

+0

我已經更新了我的答案 –

+0

我得到了可見行的數組,問題是我只能用方法cellForRowAtIndexPath訪問這些行。任何其他行給我一個(null)。我猜是因爲這個單元已經出隊了? – rnaud

1

我建議使用一個志願的辦法:

在您的awakeFromNib方法(或其他方法,你用它來實例化單元)增加以下內容:

- (void)awakeFromNib { 
    [self addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew context:nil]; 

    ... 
} 

一定要實現委託方法觀察者如下:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if([keyPath isEqualToString:@"hidden"]) { 
     NSLog(@"cell is hidden"); 
    } 
} 
+0

這不適合我。當細胞再次變爲可見時,我只會收到通知。當系統將隱藏設置爲TRUE時,KVO不會被觸發。我也嘗試覆蓋setHidden :,但是在轉換到hidden = TRUE時也不會調用它; – Klaas

8

如果你使用的是iOS 6及以上者,只需重寫此方法:

- tableView:didEndDisplayingCell:forRowAtIndexPath:

當單元格已經離開視圖時,它會被調用,你會得到它和它的indexPath。