5

セルの水平グリッドを表示するために UICollectionView を使用する IOS アプリケーションがあります。必要なのは、ユーザーが UICollectionView の最後に到達したときにデータを (遅延) ロードする賢い方法だけです。私が今使用しているコードは次のとおりです。

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

    GridCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:Cell forIndexPath:indexPath];


    /**
     TODO
     - Find a good way to check if the user has reach the end of the grid
     - This next piece of code is for demonstration purposes. A real check has to be
     done yet!!!
     **/

    // releases is my datasource //

    if(indexPath.row == (releases.count - 1)) {
        [self getNextListData];
    }

    return cell; // <-- finally return the cell


}

このコードの問題は、ユーザーが最後まで非常に速くスクロールした場合、さらに項目をロードするために前後にスクロールしなければならないことです。これは本当にユーザーフレンドリーではなく、必要なときにアイテムをロードするためのより良い方法が必要です.

誰か提案はありますか?

前もって感謝します。

4

2 に答える 2

4

UICollectionViewから継承しUIScrollViewます。スクロールに関連する一連のメソッドを持つUIScrollViewデリゲートがあります。UIScrollViewDelegateこれらのデリゲートメソッドの1つ(など)では、およびプロパティscrollViewDidBeginDecelerating:を使用して、ページに沿ってどれだけ進んでいるかを確認できます。終わりに近づいている場合(%が終わりに近い場合は、%で定義されます)、さらにデータをフェッチします。contentOffsetcontentSize

scrollviewメソッドを使用する利点は、(コレクションビューcollectionView:cellForItemAtIndexPath:ごとに不必要にコードを実行するように強制することで)速度が低下しないことです。

これは基本的に、AppleがUITableViewデータの遅延読み込みに対して提案しているのと同じ手法であり、適用方法が少し異なります。そのためのサンプルコードもいくつかあります(LazyTableImagesなど)

于 2013-03-23T18:10:19.710 に答える
2

テーブルビューでこの問題が発生したとき、ユーザーテストを行う必要がありました。テーブルが終了する前に10個のセルのロードを開始した場合、新しいセルの準備ができているはずです。データのバックグラウンドロードを実行していると仮定します。

if (indexPath.row >= [releases count] - 10)
    [self getNextListData];

どの番号が自分に適しているかを確認するために、いくつかのテストを行うことをお勧めします。

さらに、ローディングインジケーターセルもありました。セクションコールバックの行数で、常に1つ余分に返しました。

return [releases count] + 1;

行コールバックのセルの開始時に、特別な読み込みインジケーターセルを返しました。

if (indexPath.row == [releases count])
    return [JLTActivityCell sharedInstance];

そのアドバイスがコレクションビューにどのように適用されるかは正確にはわかりませんが、良い方向に向けられることを願っています。

于 2013-03-23T18:02:01.203 に答える