web-dev-qa-db-fra.com

UICollectionView willDisplayCell, méthode déléguée?

Quoi qu'il en soit, pirater UICollectionView pour appeler la méthode déléguée willDisplayCell, lors de l'affichage d'une cellule?

J'ai besoin de ceci pour le chargement paresseux, et je le fais bien avec UITableView, mais officiellement, UICollectionView n'a pas ce genre de méthode de délégué.

Alors, des idées? Merci!

18
Devfly

FYI, cela a été ajouté à l'API pour iOS 8:

- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(8_0);
10
Eli Burke

Vous pouvez utiliser SDWebImagehttps://github.com/rs/SDWebImage pour le chargement différé. Vous pouvez l'utiliser efficacement avec UICollectionView.


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

/*---------
----Other CollectiveView stuffs------
-----------------*/
if([[NSFileManager defaultManager] fileExistsAtPath:YOUR_FILE_PATH  isDirectory:NO])
{
      imagView.image=[UIImage imageWithContentsOfFile:YOUR_FILE_PATH];
}
else
{
     UIActivityIndicatorView *act=[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
     [imagView addSubview:act];
     act.center=CGPointMake(imagView.frame.size.width/2, imagView.frame.size.height/2);
     [act startAnimating];

     __weak typeof(UIImageView) *weakImgView = imagView; 
     [imagView setImageWithURL:[NSURL URLWithString:REMOTE_FILE_PATH] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType){
    for(UIView *dd in weakImgView.subviews)
    {
        if([dd isKindOfClass:[UIActivityIndicatorView class]])
        {
            UIActivityIndicatorView *act=(UIActivityIndicatorView *)dd;
            [act stopAnimating];
            [act removeFromSuperview];
        }
    }
    NSString *extension=[YOUR_FILE_PATH pathExtension];

    [self saveImage:image withFileName:YOUR_FILE_PATH ofType:extension];
  }];
 }
}
0
Ajith Tom

J'ai une situation similaire lorsque j'ai besoin de connaître le chemin d'index de la cellule qui va être affiché. Terminé avec - (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath. On suppose que l’un est "didEndDisplaying", un autre est "willDisplayed".

0
BabyPanda

Je fais quelque chose comme ceci dans cellForItemAtIndexPath: (pour le chargement d'images paresseux):

  • Si mon modèle contient l'image, définissez simplement l'image de la cellule
  • Si le modèle n'a pas d'image, coup d'envoi d'un chargement asynchrone
  • Lorsque le chargement est terminé, la vérification si le chemin indexPath d'origine est toujours visible
  • Si tel est le cas, appelez cellForItemAtIndexPath pour la propriété indexPath d'origine. Puisque l'image existe maintenant dans le modèle, l'image de la cellule sera maintenant définie. 

Ressemble à ça:

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

    PhotoCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"PhotoCell" forIndexPath:indexPath];
id imageItem = [self.photoSet objectAtIndex:indexPath.row];
        ImageManager * listingImage = (ImageManager *)imageItem;
        if(listingImage.image){
            cell.image = listingImage.image;
        } else {
            [listingImage loadImage:^(UIImage *image) {
                [collectionView reloadItemsAtIndexPaths:@[indexPath]];
                dispatch_async(dispatch_get_main_queue(), ^{
                    if ([[collectionView indexPathsForVisibleItems] containsObject:indexPath]) {
                        [(PhotoCell *)[collectionView cellForItemAtIndexPath:indexPath] setImage:image];
                    }
                });
            }];
        }
    }

    return cell;
}
0
DeepFriedTwinkie