teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

補足を追加しました。

2019/02/05 08:58

投稿

fumiaki
fumiaki

スコア56

answer CHANGED
@@ -23,4 +23,25 @@
23
23
  }
24
24
  ```
25
25
 
26
- 簡単な対応としては、上記のcellを返却しているif文の箇所をコメントアウトすれば、毎回cellの画像がindexPathに応じたものにセットし直されることになるので想定している挙動になるかと思います。
26
+ 簡単な対応としては、上記のcellを返却しているif文の箇所をコメントアウトすれば、毎回cellの画像がindexPathに応じたものにセットし直されることになるので想定している挙動になるかと思います。
27
+
28
+
29
+ ---
30
+ **補足**
31
+ ```swift
32
+ let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
33
+ ```
34
+ 上記の処理でCollectionViewから"cell"というIDの付いたセルを取得しています。
35
+ この時、CollectionViewは同じIDを持った再利用可能なセルが有ればそれを取得し、
36
+ 再利用可能なものがなければ新しく生成したセルを返却してきます。
37
+
38
+ 再利用可能かどうかは、基本的に画面に表示中かどうかで判断されているようなので、
39
+ 画面外に出たセルが再利用される形になります。
40
+ ※ちなみに、画面に表示中の有効なセルはCollectionViewのvisibleCellsという配列に格納されています。
41
+
42
+ 前述にも軽く書きましたが、dequeueReusableCell(withReuseIdentifier:for:)メソッドの引数のIDが同じものの中でセルの再利用が行われます。
43
+ 極端な話、すべてのセルで異なるIDを使えば再利用が行われず、indexPathでユニークにすることも可能です。。
44
+ ※ただし、すべてのセルがメモリ上にキャッシュされることになってしまうので、推奨される方法ではありません。
45
+ (あと、事前にセルのIDを決めて準備しておかないといけないので、面倒です。)
46
+
47
+ 作ったセルは再利用されるものと思って実装しておいたほうが、今回の様な現象を見た時に対処しやすいと思います。

1

文字表記の修正

2019/02/05 08:58

投稿

fumiaki
fumiaki

スコア56

answer CHANGED
@@ -3,7 +3,7 @@
3
3
  cellForItem(at:)のメソッド内の処理について
4
4
  dequeueReusableCell(withReuseIdentifier:for:)メソッドで生成(or再利用)されたセルを取得・返却していますが、再利用される際には同じindexPathのセルが再利用されるわけではありません。
5
5
 
6
- 例えば、一度下にスクロールしてセルが表示された後に、上にスクロールして行った場合、画面外に出た下のセルが新しく上から表示されるセルに再利用されたりします。
6
+ 例えば、一度下にスクロールしてセルが表示された後に、上にスクロールしなおした場合、画面外に出た下のセルが新しく上から表示されるセルに再利用されたりします。
7
7
 
8
8
  提示していただいたソースの以下の箇所で、cellの中身を更新せずに再利用されたセルを返却しているので、count_cellfuncの値がphotos.countを上回った段階から再利用されたセルがそのまま表示されることになります。
9
9