L'appel de setCollectionViewLayout:animation ne recharge pas UICollectionView

Je suis à l'aide d'un UICollectionView avec deux modèles personnalisés qui sont sous-classé de UICollectionViewFlowLayout

Quand ma vue se charge tout d'abord je l'ai mis à une vue par défaut à l'aide de:

[self.collectionView setCollectionViewLayout:self.tableViewLayout];

Ce appels: cellForItemAtIndexPath - donc pas de problème là. C'est dans viewWillAppear méthode.

Puis-je utiliser un UIButton pour modifier la mise en page de la vue actuelle de la prochaine mise en page comme ceci:

-(void)changeViewLayoutButtonPressed
{
    self.changeLayout = !self.changeLayout;


    if (self.changeLayout){

        [self.tradeFeedCollectionView setCollectionViewLayout:self.grideLayout animated:YES];

    }

    else {


        [self.tradeFeedCollectionView setCollectionViewLayout:self.tableViewLayout animated:YES];

    }
}

Après cet appel - numberOfItemsInSection est appelé. J'ai vérifié dans le débogueur que le retour de compte n'est pas zéro.

Après cet appel, rien d'autre n'est appelé et mon UICollectionView modifie la mise en page mais depuis cellForItemAtIndexPath n'est pas nommé - les cellules ne sont pas correctement paramétré.

si j'ai mis [self.collectionView roloadData] à l'intérieur de numberOfItemsInSection - alors cellForItemAtIndexPath est appelé et les cellules sont de l'installation.

Je ne devrais pas besoin de faire un appel manuel de recharger les données dans numberOfItemsInSection. Quelqu'un peut me dire ce qui se passe?

Modifier

J'ai oublié de mentionner que je suis à l'aide de deux UINibs pour les deux cellules différentes, comme ils ont besoin de légèrement différentes dispositions sont appliquées. Serait-ce un problème?
Merci!

Edit 2

Droite, donc j'ai eu à travailler presque comme je veux. Voici tout le code utilisé pour l'affichage de la collection et comment je modifier ses dispositions.

Les Dispositions Personnalisées

Ce sont des sous-classé de UICollectionViewFlowLayout - La raison pour laquelle je sous-classé est tout simplement en raison de la face de mon UICollectionView besoins à l'apparence et au comportement très proche de la Pomme de pré-faites la mise en page. Juste différentes tailles de cellule, cependant.

TableViewLayout
- Pas de code dans le fichier d'en-tête.
- BBTradeFeedTableViewLayout.m

@implementation BBTradeFeedTableViewLayout

-(id)init
{
    self = [super init];

    if (self){

        self.itemSize = CGSizeMake(320, 80);
        self.minimumLineSpacing = 0.1f;
    }

    return self;
}
@end

Gride Disposition
- Pas de code dans le fichier d'en-tête.
- BBTradeFeedGridViewLayout.m

   @implementation BBTradeFeedGridViewLayout

-(id)init
{
    self = [super init];

    if (self){

        self.itemSize = CGSizeMake(159, 200);
        self.minimumInteritemSpacing = 0.1f;
        self.minimumLineSpacing = 0.1f;
    }
    return self; 
}
@end

Puis dans le ViewController qui a mon UICollectionView - je déclarer les deux modèles personnalisés comme:

@property (strong, nonatomic) BBTradeFeedTableViewLayout *tableViewLayout;
@property (strong, nonatomic) BBTradeFeedGridViewLayout *grideLayout;

Je puis d'enregistrer les deux .xib fichiers pour le collectionView:

  [self.tradeFeedCollectionView registerNib:[UINib nibWithNibName:@"BBItemTableViewCell" bundle:nil] forCellWithReuseIdentifier:@"TableItemCell"];
        [self.tradeFeedCollectionView registerNib:[UINib nibWithNibName:@"BBItemGridViewCell" bundle:nil] forCellWithReuseIdentifier:@"GridItemCell"];

Puis, j'ai un UIButton qui modifie la mise en page:

    -(void)changeViewLayoutButtonPressed
{

    if (!self.gridLayoutActive){

        self.gridLayoutActive = YES;
        [self.tradeFeedCollectionView setCollectionViewLayout:self.grideLayout animated:YES];
        self.lastLayoutUsed = @"GridLayout";

    }

    else {

        self.gridLayoutActive = NO;

        [self.tradeFeedCollectionView setCollectionViewLayout:self.tableViewLayout animated:YES];
        self.lastLayoutUsed = @"TableLayOut";
    }
    [self.tradeFeedCollectionView reloadItemsAtIndexPaths:[self.tradeFeedCollectionView indexPathsForVisibleItems]];

}

Enfin - quand un appel de service web se fait - il appelle [self.tradeFeedCollectionView reloadData];

Donc il ma UICollectionView obtient reloaded et la dernière méthode:

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

{   static NSString *tableCellIdentifier = @"TableItemCell";
    static NSString *gridCellIdentifier = @"GridItemCell";

    if (indexPath.item < [self.tradeSearchArray count]){

    if (self.gridLayoutActive == NO){

        BBItemTableViewCell *tableItemCell = [collectionView dequeueReusableCellWithReuseIdentifier:tableCellIdentifier forIndexPath:indexPath];

    if ([self.tradeSearchArray count] > 0){

        self.toolBarButtomItem.title = [NSString stringWithFormat:@"%d Results", self.searchResult.searchResults];

        tableItemCell.gridView = NO;
        tableItemCell.backgroundColor = [UIColor whiteColor];
        tableItemCell.item = self.tradeSearchArray[indexPath.row];

    }
        return tableItemCell;
}else

    {

        BBItemTableViewCell *gridItemCell= [collectionView dequeueReusableCellWithReuseIdentifier:gridCellIdentifier forIndexPath:indexPath];

    if ([self.tradeSearchArray count] > 0){

        self.toolBarButtomItem.title = [NSString stringWithFormat:@"%d Results", self.searchResult.searchResults];


        gridItemCell.gridView = YES;
        gridItemCell.backgroundColor = [UIColor whiteColor];
        gridItemCell.item = self.tradeSearchArray[indexPath.row];

    }

    return gridItemCell;
    }

Le problème avec le code ci-dessus

Le code ci-dessus fonctionne. Cependant, les cellules n'animez pas bien, et il semble étrange, presque comme si une actualisation qui s'est passé. Qui est en raison de l'appel:

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

Mais c'est la seule façon que je pouvais obtenir pour être proche de ce que je veux.

  • Je trouve cette question très longtemps.
  • Quoi de mal à cela?