web-dev-qa-db-fra.com

Comment insérer une cellule dans UICollectionVIew par programme?

J'ai un UICollectionView et cela fonctionne très bien, mais je veux ajouter quelques UICollectionViewCells éléments par programme dans la vue de la collection.

Alors, comment puis-je y parvenir?

Pour clarifier davantage: quand je dis par programme, je veux dire insérer une cellule pendant l'exécution, lorsqu'une action est déclenchée, pas lorsque l'application est chargée (en utilisant la méthode viewDidLoad). Je sais quand le modèle est mis à jour et que l'appel est fait à UICollectionView dans le insertItemsAtIndexPaths: méthode. Il devrait créer de nouvelles cellules, mais il ne fait pas cela, il lance une erreur.

21
Muhammad Nasir

... En se référant à documentation UICollectionView

Vous pouvez accomplir:

Insertion, suppression et déplacement de sections et d'éléments Pour insérer, supprimer ou déplacer une seule section ou élément, procédez comme suit:

  1. Mettez à jour les données de votre objet source de données.
  2. Appelez la méthode appropriée de la vue de collection pour insérer ou supprimer la section ou l'élément.

Il est essentiel que vous mettiez à jour votre source de données avant d'aviser la vue de la collection de toute modification. Les méthodes d'affichage de la collection supposent que votre source de données contient les données actuellement correctes. Si ce n'est pas le cas, la vue de collection peut recevoir le mauvais ensemble d'éléments de votre source de données ou demander des éléments qui ne sont pas là et planter votre application. Lorsque vous ajoutez, supprimez ou déplacez un seul élément par programme, les méthodes de la vue de collection créent automatiquement des animations pour refléter les modifications. Cependant, si vous souhaitez animer plusieurs modifications ensemble, vous devez effectuer tous les appels d'insertion, de suppression ou de déplacement à l'intérieur d'un bloc et transmettre ce bloc à la méthode performBatchUpdates: complétion:. Le processus de mise à jour par lots anime ensuite toutes vos modifications en même temps et vous pouvez mélanger librement les appels pour insérer, supprimer ou déplacer des éléments dans le même bloc.

À partir de votre question: vous pouvez par exemple enregistrer un identificateur de geste et insérer une nouvelle cellule en procédant comme suit:

dans

// in .h 
@property (nonatomic, strong) NSMutableArray *data;

// in .m 
@synthesize data
// 

- (void)ViewDidLoad{
      //.... 

    myCollectonView.dataSource = self;
    myCollectionView.delegate = self; 
    data = [[NSMutableArray alloc] initWithObjects:@"0",@"1", @"2" @"3", @"4", 
                                                   @"5",@"6", @"7",  @"8", @"9",  
                                                   @"10", @"11", @"12", @"13",
                                                   @"14", @"15", nil];

    UISwipeGestureRecognizer *swipeDown = 
     [[UISwipeGestureRecognizer alloc] 
       initWithTarget:self action:@selector(addNewCell:)];
    swipeDown.direction = UISwipeGestureRecognizerDirectionDown;
        [self.view addGestureRecognizer:swipeDown];
    //.. 
} 


-(void)addNewCell:(UISwipeGestureRecognizer *)downGesture {
    NSArray *newData = [[NSArray alloc] initWithObjects:@"otherData", nil];
    [self.myCollectionView performBatchUpdates:^{
        int resultsSize = [self.data count]; //data is the previous array of data
        [self.data addObjectsFromArray:newData];
        NSMutableArray *arrayWithIndexPaths = [NSMutableArray array];

        for (int i = resultsSize; i < resultsSize + newData.count; i++) {
            [arrayWithIndexPaths addObject:[NSIndexPath indexPathForRow:i 
                                                              inSection:0]];
        }
        [self.myCollectionView insertItemsAtIndexPaths:arrayWithIndexPaths];
    } completion:nil];

}
24
abdimuna

Si vous insérez plusieurs items dans UICollectionView, vous pouvez utiliser performBatchUpdates:

[self.collectionView performBatchUpdates:^{
    // Insert the cut/copy items into data source as well as collection view
    for (id item in self.selectedItems) {
        // update your data source array
        [self.images insertObject:item atIndex:indexPath.row];

        [self.collectionView insertItemsAtIndexPaths:
          [NSArray arrayWithObject:indexPath]];          
    }
}
12
Anil Varghese

– insertItemsAtIndexPaths: Fait le travail

6
Oleg

Voici comment insérer un élément dans Swift 3:

    let indexPath = IndexPath(row:index, section: 0) //at some index
    self.collectionView.insertItems(at: [indexPath])

Vous devez d'abord mettre à jour vos données.

4
Curnelious