3

我有一個UICollectionView,其中一個UIActivityIndi​​cator在圖像加載之前顯示在單元格中,然後無論UIImageView + AFNetworking塊中的成功或失敗都會被忽略。不過有時我會得到一些似乎沒有隱藏或停止動畫的剩餘活動指標。UIAollectionView單元格中的UIActivityIndi​​cator隨機不會隱藏

這是我cellForItemAtIndexPath的一部分:

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
... 
NSURL *imageURL = [NSURL URLWithString:[tmpcamera objectForKey:@"url"]]; 
NSURLRequest *imageRequest = [NSURLRequest requestWithURL:imageURL cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10]; 

UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; 
activityIndicator.hidesWhenStopped = YES; 
activityIndicator.hidden = NO; 
activityIndicator.frame = CGRectMake(0, 0, 130, 110); 
activityIndicator.tag = 10; 

[cell.imageView addSubview:activityIndicator]; 
[activityIndicator startAnimating]; 

__weak typeof(FavouriteCell) *weakImage = cell; 
[cell.imageView setImageWithURLRequest:imageRequest 
         placeholderImage:[UIImage imageNamed:@"trans50.png"] 
           success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *i) 
{ 
    [activityIndicator stopAnimating]; 
    activityIndicator.hidden = YES; 
    [activityIndicator removeFromSuperview]; 
    [weakImage.imageView setImage:i]; 

} 
           failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) 
{ 
    [activityIndicator stopAnimating]; 
    activityIndicator.hidden = YES; 
    [activityIndicator removeFromSuperview]; 
    [weakImage.imageView setImage:[UIImage imageNamed:@"errorimage.png"]]; 
}]; 
... 
} 

我不確定如果這個代碼就足以調試是什麼問題,但任何想法,將不勝感激。

什麼我談論的樣本屏幕截圖是在這裏:

sample

回答

3

因爲你的細胞可以被回收/再利用之前的圖像要求有機會成功或失敗(通過滾動,爲例如),你可以在單元中產生一個「孤立的」活動指標。

事件序列:

  1. 的小區負載,嘗試加​​載圖像並將該圖像加載之前開始活動的指標
  2. 用戶滾動。細胞被回收。
  3. 該單元格被重用。一個新的活動指示器被添加,並且之前的圖像加載被中止(所以以前的成功/失敗塊從不被調用)。舊的和新的活動指標現在都在單元格上,舊的指標仍在運行。

一些建議,以避免這個問題:

  1. 創建一個包含活動指標自定義單元格。
  2. 創建活動指示器時,爲指示器的標記屬性指定一個數字,然後通過viewWithTag查看是否已有活動指示器:重用單元時。如果它已經存在,則使用現有的,否則,創建一個新的。
+0

謝謝!我認爲這是滾動造成的,因爲我使用拉來重新加載,而且只有當我很快完成時纔會發生。我會嘗試你的建議。 –

+0

要明確,這兩個建議是替代方案 - 要麼將活動指示符的概念添加到您的單元格,要麼使用標記屬性跟蹤現有活動指示符。 :) – dmercredi

+0

您也可以通過覆蓋UICollectionViewCell的prepareForReuse方法來進行一些清理工作。如果您遵循dmercredi的第一條建議(我建議),您只需致電stopAnimating,然後隱藏activityIndi​​cator。 –

相關問題