2012-12-17 3 views
6

Bei bestimmten Ereignissen,Wie Sie alle Elemente entfernen und neue Elemente zu UICollectionView hinzufügen?

Ich möchte alle Zellen in einem uicollectionview entfernen und neue Zellen hinzufügen. (Die als Folge eines Netzanruf bevölkert wird)

Ich versuchte deleteItemsAtIndexPaths verwenden. reloadSections, deleteSections/insertSections.

Jeder von ihnen stürzte meine App.

Unten ist mein Code.

NSMutableArray* indexPathArray = [[NSMutableArray alloc] init]; 

for(int i=0; i < [self.jsonAlbumImageArray count]; ++i) 
{ 
    NSIndexPath* newPath = [NSIndexPath indexPathForRow:i inSection:0]; 
    [indexPathArray addObject: newPath]; 
} 

[self.jsonAlbumImageArray removeAllObjects]; 

if(indexPathArray.count > 0) 
{ 
    [self.collectionView performBatchUpdates:^{ 
      [self.collectionView deleteItemsAtIndexPaths:indexPathArray]; 
     } 
    completion: nil]; 
} 

// NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 1)];                                               
// NSIndexSet* indexSet = [NSIndexSet indexSetWithIndex:0];                                                     
// [self.collectionView reloadSections:indexSet];                                                       

[self get_IMAGE_LIST_FROM_SERVER]; 
+1

Verwendung '[Collectionreload]' –

Antwort

4

Ja, wie Jonathan sagte, ich glaube, was wollen Sie Ihre Datenquelle mit den neuen Daten zu tun, ändern und einfach „refresh“ oder die UICollectionView neu zu laden.

+0

Was, so dass Sie sagen, wenn Sie Ihre Datenquelle völlig klar und machen eine '' '[Collectionreload]' '' die App wird nicht abstürzen und die Sammlung Ansicht wird geklärt? – Supertecnoboff

+0

Wenn Sie "Löschen Sie Ihre Datenquelle" meinen, machen Sie es ein 0-Count-Objekt, dann ja, das ist genau das, was passieren wird. Wenn Sie jedoch "nil" machen, erhalten Sie möglicherweise unerwartete Ergebnisse, je nachdem, ob Sie swift oder obj-c verwenden. –

+1

Awesome danke Travis und ja, das ist was ich meinte :) – Supertecnoboff

6

Für den Fall, dass Sie eine glattere Animation als die von [collectionView reloadData] benötigen, können Sie dies mit den Methoden insert und delete tun, hier ist ein Beispiel.

-(void)deleteItemsFromDataSourceAtIndexPaths:(NSArray *)itemPaths 
{ 
    NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet]; 
    for (NSIndexPath *itemPath in itemPaths) { 
     [indexSet addIndex:itemPath.row]; 
    } 
    [self.apps removeObjectsAtIndexes:indexSet]; 
} 

-(void)insertItems:(NSArray*)items ToDataSourceAtIndexPaths:(NSArray *)itemPaths 
{ 
    NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet]; 
    for (NSIndexPath *itemPath in itemPaths) { 
     [indexSet addIndex:itemPath.row]; 
    } 
    [self.apps insertObjects:items atIndexes:indexSet]; 
} 

-(void)reloadDataSmooth{ 
     [self.collectionView performBatchUpdates:^{ 

      NSMutableArray *arrayWithIndexPathsDelete = [NSMutableArray array]; 
      NSMutableArray *arrayWithIndexPathsInsert = [NSMutableArray array]; 

      int itemCount = [self.items count]; 

      for (int d = 0; d<itemCount; d++) { 
       [arrayWithIndexPathsDelete addObject:[NSIndexPath indexPathForRow:d inSection:0]]; 
      } 
      [self deleteItemsFromDataSourceAtIndexPaths:arrayWithIndexPathsDelete]; 
      [self.collectionView deleteItemsAtIndexPaths:arrayWithIndexPathsDelete]; 

      int newItemCount = [newItems count]; 

      for (int i=0; i<newAppCount; i++) { 
       [arrayWithIndexPathsInsert addObject:[NSIndexPath indexPathForRow:i inSection:0]]; 
      } 
      [self insertItems:newItems ToDataSourceAtIndexPaths:arrayWithIndexPathsInsert]; 

      [self.collectionView insertItemsAtIndexPaths:arrayWithIndexPathsInsert]; 
     } 
     completion:nil]; 
    } 
} 
+1

Was ist 'selb.apps' hier? –

+0

@ TejaswiYerukalapudi ein Array (veränderbar) von CollectionCells – Emilio

Verwandte Themen