93

私は自分のアプリを iOS 7 で実行するように更新してきましたが、これはほとんどの部分で順調に進んでいます。複数のアプリで、reloadDataa のメソッドが以前のUICollectionViewControllerように機能していないことに気付きました。

をロードしUICollectionViewControllerUICollectionView通常どおりデータを入力します。これは初めてうまく機能します。ただし、新しいデータを要求し ( に入力UICollectionViewDataSource)、 を呼び出すと、reloadDataと のデータ ソースがクエリされますが、適切な回数呼び出されないようです。numberOfItemsInSectionnumberOfSectionsInCollectionViewcellForItemAtIndexPath

1 つのセクションのみをリロードするようにコードを変更すると、正しく機能します。これらを変更しても問題ありませんが、変更する必要はないと思います。reloadDataドキュメントに従って、表示されているすべてのセルをリロードする必要があります。

他の誰かがこれを見たことがありますか?

4

18 に答える 18

72

メインスレッドでこれを強制します:

dispatch_async(dispatch_get_main_queue(), ^ {
    [self.collectionView reloadData];
});
于 2013-12-04T21:09:08.520 に答える
65

私の場合、データソース内のセル/セクションの数は変更されず、画面に表示されているコンテンツをリロードしたかっただけです..

次のように呼び出すことで、これを回避できました。

[self.collectionView reloadItemsAtIndexPaths:[self.collectionView indexPathsForVisibleItems]];

それから:

[self.collectionView reloadData];
于 2013-09-30T18:04:45.153 に答える
26

私はまったく同じ問題を抱えていましたが、何が間違っているのかを見つけることができました。私の場合、 collectionView:cellForItemAtIndexPath:からreloadDataを呼び出していましたが、これは正しくないようです。

reloadDataの呼び出しをメイン キューにディスパッチすると、問題が完全に修正されました。

  dispatch_async(dispatch_get_main_queue(), ^{
    [self.collectionView reloadData];
  });
于 2014-03-02T21:25:11.533 に答える
12

スイフト 5 – 4 – 3

// GCD    
DispatchQueue.main.async(execute: collectionView.reloadData)

// Operation
OperationQueue.main.addOperation(collectionView.reloadData)

スイフト2

// Operation
NSOperationQueue.mainQueue().addOperationWithBlock(collectionView.reloadData)
于 2015-09-06T18:30:43.510 に答える
1

まず、このスレッドをありがとう、とても役に立ちました。Reload Data で同様の問題がありましたが、特定のセルを永続的に選択できなくなったのに対し、他のセルは選択できなかったという症状がありました。indexPathsForSelectedItems メソッドまたは同等のメソッドへの呼び出しはありません。デバッグは、データの再読み込みを指摘しました。上記の両方のオプションを試しました。私の場合、他のオプションが機能しなかったか、コレクションビューをミリ秒ほど点滅させていたため、ReloadItemsAtIndexPathsオプションを採用することになりました。以下のコードはうまくいきます:

NSMutableArray *indexPaths = [[NSMutableArray alloc] init]; 
NSIndexPath *indexPath;
for (int i = 0; i < [self.assets count]; i++) {
         indexPath = [NSIndexPath indexPathForItem:i inSection:0];
         [indexPaths addObject:indexPath];
}
[collectionView reloadItemsAtIndexPaths:indexPaths];`
于 2014-04-15T22:25:45.677 に答える
1

スイフト5

私にとってreloadItems(at:)は、reloadData.

collectionView.reloadItems(at: collectionView.indexPathsForVisibleItems)

(リアムニコルスの答えの迅速なバージョン)

于 2021-02-05T19:20:19.950 に答える
0

iOS 8.1 SDKでも発生しましたがdatasource、メソッドを更新した後でもnumberOfItemsInSection:新しいアイテム数が返されないことに気付いたとき、それは正しくなりました。カウントを更新して動作させました。

于 2015-03-20T04:53:51.307 に答える
0

UICollectionView.contentInset を設定していますか? 左右の edgeInset を削除します。削除した後はすべて問題ありません。バグは iOS8.3 にまだ存在します。

于 2015-07-09T04:59:20.213 に答える
0

これがSwift 4でどのように機能したかです

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

let cell = campaignsCollection.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! Cell

cell.updateCell()

    // TO UPDATE CELLVIEWS ACCORDINGLY WHEN DATA CHANGES
    DispatchQueue.main.async {
        self.campaignsCollection.reloadData()
    }

    return cell
}
于 2018-06-04T03:39:09.380 に答える