2016-10-29 18 views
2

私は数年前から楽しく出荷しているアプリを持っています。 UICollectionViewでRSSフィードを取得します。 cellForItemAtIndexPathメソッドはテキストを設定し、フィードで指定されたリンクから画像を読み込むデータソースメソッドを呼び出します。存在しない場合は、ウェブページデータをロードし、<img>タグを検索して画像を取得します。画像が見つかると、デリゲートメソッドが呼び出され、画像がセルに追加されます。 (下)UIcollectionView cellForItemAtIndexPathは、iOS 10でのみNullを返します。 iOS 9とiOS 8でうまく動作します

iOS 8および9で動作しているときは、すべてがうれしいですが、iOS 10で実行すると、RSSフィードが最初に読み込まれたときに表示されるセルが画像で更新されますが、スクロールすると画像が追加されず、 cellForItemAtIndexPath。

imageWasLoadedForStoryにreloadItemsAtIndexPathsを追加すると、スクロールバックしてイメージが表示されますが、reloadItemsAtIndexPathsによってパフォーマンスが低下します。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
      // ...  

      if (story.thumbnail) { 
      [imageView setAlpha: 1.0]; 
      imageView.image = story.thumbnail; 
      UIActivityIndicatorView *lActivity = (UIActivityIndicatorView *) [collectionView viewWithTag: 900]; 
      [lActivity removeFromSuperview]; 
      }else{ 
       [story setDelegate: self]; 
       [story findArticleImageForIndexPath: indexPath]; 
      } 
      // ... 
} 



//delegate method. Called when image has been loaded for cell at specified indexpath 

- (void) imageWasLoadedForStory: (RSSStory *) story forIndexPath: (NSIndexPath *) indexPath 
{ 
     //get cell 
     CustomCollectionViewCell *customCell = (id) [self.collectionview cellForItemAtIndexPath: indexPath]; 

     NSLog(@"imageWasLoadedForStory row %i section %i and class %@", (int)indexPath.row, (int)indexPath.section, [customCell class]); 

     //if cell is visible ie: cell is not nil then update imageview 
     if (customCell) { 
       UIImageView *imageView = (UIImageView *) [customCell viewWithTag: 300]; 
       imageView.image = story.thumbnail; 
       UIActivityIndicatorView *lActivity = (UIActivityIndicatorView *) [customCell viewWithTag: 900]; 
       [lActivity removeFromSuperview]; 
       [customCell setNeedsLayout]; 
       [customCell setNeedsDisplay]; 
       } 
        //[self.collectionview reloadItemsAtIndexPaths: [NSArray arrayWithObject: indexPath]];   
} 



- (void) findArticleImageForIndexPath: (NSIndexPath *) indexPath 
{ 
      //kick off image search 
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

       self.thumbnail = [self findArticleForStoryForIndexPath:indexPath]; 
       dispatch_async(dispatch_get_main_queue(), ^{ 
       //image set - return 
         [self.delegate imageWasLoadedForStory: self forIndexPath: indexPath]; 
       }); 
     }); 
} 
+0

まあ、私は狂っていないかもしれません。私はtagプロパティを使って動作させることができました。 cellForItemAtIndexPathに、私は追加しました: [セルsetTag:indexPath.row]; そして、私のデリゲートメソッドで追加されました: CustomCollectionViewCell * customCell =(CustomCollectionViewCell *)[self.collectionview viewWithTag:indexPath.row]; これはすべて機能しますが、これを規制する方法ではないと私は考えています。 –

答えて

15

私はプリフェッチをよく読んでために皆を奨励 - 新しいiOSの10に簡単な解決策はこれです:

[self.customCollectionview setPrefetchingEnabled:NO]; 

それは、細胞が、今プリフェッチさ結局のところ。これは、ロード/非表示セルとロード/可視セルの間に差があることを意味します。

iOS 10では、セルをプリロードできるようになりましたが、表示されていない場合でもnilが返されます。したがって、cellForItemAtIndexPathは、セルをプリロードするために呼び出されます。その後、画像がロードされ、cellForItemAtIndexPathはセルが表示されていない場合はnilを返します。つまり、imageViewは設定されません。セルが既に作成されているため、画像のスクロールはセルに追加されません。

Getting loaded vs visible cells on a UITableView or UICollectionView

+0

ありがとうございましたJoe :)。 –

+0

あなたのソリューションは私の場合はうまくいきません。 'viewDidLoad()'に 'self.collectionView.isPrefetchingEnabled = false'を設定しましたが、' didDeselectItemAt indexPath: 'で' cellForItem(at:) 'を呼び出すと' nil'が返されます。 –

+0

あなたが何を記述しているのか他に何かがあるはずです。 (indexPathが間違っているなど)誰かがセルを選択している場合は、そのセルをロードする必要があります。プリフェッチが適用される唯一の時間は、セルが表示される前です。すなわち、ユーザが下にスクロールしており、セル2から8が見える。 iOS 10の場合、セル9〜15は可視になることを予期してプリロードされます。それがプリフェッチが問題になる唯一の時間です。 –

0

あなたは[self.collectionview cellForItemAtIndexPath: indexPath] にアクセスしようとしているセルが表示されていることを確認してください。

表示されていない場合は常にnilを返します。

セル自体にアクセスするのではなく、そのセルに表示しているデータを取得するには、データソース(配列、コアデータなど)にアクセスする必要があります。

+0

ありがとうございます。私は目に見えない場合は無しと期待していますが、奇妙なのは、iOS 9で実行すると完全に動作することです。さらに、セルの行に等しいタグプロパティを追加し、 :CustomCollectionViewCell * customCell =(CustomCollectionViewCell *)[self.collectionview viewWithTag:indexPath.row]; –

+0

挫折。ゆっくりとスクロールするとnilを返します。すなわち、画像がロードされたときにセルが生成されるが、まだ可視ではない。私が速くセルにスクロールすると、それは動作します。つまり、ロードされたイメージが返され、セルが表示されます。 –

関連する問題