13

呼び出し後-[UICollectionView reloadData]、セルが表示されるまでに時間がかかるため、呼び出し直後の項目の選択reloadDataはできません。直後にアイテムを選択する方法はありますreloadDataか?

4

9 に答える 9

13

この回答に沿って、collectionViewに対して他のことを行う前に、 layoutIfNeededafterを呼び出すとreloadDataリロードが効果的に「フラッシュ」されるように見えることがわかりました。

[self.collectionView reloadData];
[self.collectionView layoutIfNeeded];
...

私がこの解決策を見つけたページで、一部のコメント投稿者は、iOS 9では機能しないと述べましたが、私にとっては問題ないので、マイレージは異なる場合があります。

于 2016-07-26T00:30:24.700 に答える
4

でセルの選択を処理していcollectionView: cellForItemAtIndexPath:ます。私が見つけた問題は、セルが存在しない場合、単に呼び出すだけでselectItemAtIndexPath: animated: scrollPosition:は実際にはアイテムが選択されないということでした。

代わりに、次のことを行う必要があります。

cell.selected = YES;
[m_collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone];

于 2013-03-14T16:00:44.767 に答える
4

reloadDataを使用しないでください

- (void)performBatchUpdates:(void (^)(void))updates completion:(void (^)(BOOL finished))completion代わりに使用してください。完了ブロックは、セルの挿入/削除などのアニメーションが完了した後に実行されます。(void (^)(void))updatesブロックにreloadDataの呼び出しを置くことができます

于 2013-05-14T19:02:12.663 に答える
4

Appleは言う:

アイテムが挿入または削除されるアニメーションブロックの途中でこのメソッドを呼び出さないでください。挿入と削除により、テーブルのデータが自動的に適切に更新されます。

UICollectionView実際、アニメーションの途中(スクロールを含む)でこのメソッドを呼び出さないでください。

したがって、次を使用できます。

[self.collectionView setContentOffset:CGPointZero animated:NO];
[self.collectionView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

または、アニメーションがないことを確認してから、reloadData;を呼び出します。また

[self.collectionView performBatchUpdates:^{
//insert, delete, reload, or move operations
} completion:nil];

これがお役に立てば幸いです。

于 2014-05-05T17:25:24.863 に答える
4

スウィフトウェイ:

let selected = collectionView.indexPathsForSelectedItems()
collectionView.performBatchUpdates({ [weak self] in
    self?.collectionView.reloadSections(NSIndexSet(index: 0))
    }) { completed -> Void in
        selected?.forEach { [weak self] indexPath in
            self?.collectionView.selectItemAtIndexPath(indexPath, animated: false, scrollPosition: [])
        }
}
于 2016-03-01T16:29:38.080 に答える
0

reloadDataメインスレッドを呼び出していることを確認してください。これが、セルの更新の遅延の原因である可能性があります。

于 2013-01-14T06:09:08.833 に答える
0

willDisplayCellcolelctionViewデリゲートで処理しました。アイデア:最初のスクロールがすでに実行されているかどうかを指定するには、一時変数が必要です(scrollIsRequired)。最後に表示されたセルが表示されたら、必要なセルまでスクロールしてこの変数を設定し、再度スクロールしないようにします。

- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath{

    //Perform any configuration

    if (CGRectGetMaxX(collectionView.frame) <= CGRectGetMaxX(cell.frame)) {
        // Last visible cell
        if (self.scrollIsRequired) {
            [self.collectionView selectItemAtIndexPath:[NSIndexPath indexPathForItem:self.initiallySelectedRepresentativeVerse inSection:0] animated:YES scrollPosition:UICollectionViewScrollPositionLeft];
            self.scrollIsRequired = NO;
        }
    }
}

それは私にとって魅力のように働いてきました。

于 2015-01-13T13:32:53.390 に答える
0

これは私のために働いたものです:

選択したインデックスパスの参照を保持し、reloadData関数をオーバーライドしました。

override func reloadData() {
    super.reloadData()
    self.selectItem(at: self.selectedIndexPath, animated: false, scrollPosition: UICollectionViewScrollPosition())
}

I tried doing it using indexPathForSelectedItems, but it was creating an infinite loop on collection view load.

于 2017-06-15T15:44:09.647 に答える
-6

選択を行うメソッドを作成し、reloadを呼び出した後にperformSelectorを使用して呼び出します。

[self performSelector:@selector(selectIt) withObject:self afterDelay:0.1];
于 2013-01-08T10:30:53.853 に答える