14

Ich verwende eine CollectionView in meiner ios App. Jede Sammlungszelle enthält eine Schaltfläche zum Löschen. Durch Klicken auf die Schaltfläche sollte die Zelle gelöscht werden. Nach dem Löschen wird dieser Speicherbereich mit der Zelle unterhalb gefüllt (ich möchte die CollectionView nicht neu laden und von oben neu starten)Zelle aus UICollectionView löschen, ohne erneut von oben zu laden

Wie lösche ich eine bestimmte Zelle aus UICollectionView mit automatischem Layout?

+0

Kurz gesagt: Sie sollten MVC-Protokoll folgen. Löschen Sie die Daten aus Model und laden Sie dann Ihre Ansicht neu. Für eine detailliertere Antwort sollten Sie Ihren Code posten (nur die Teile, bei denen Sie vermuten, dass das Problem vorliegt) und beschreiben, was Sie bereits versucht haben ... Sonst werden Sie nur eine Antwort bekommen, statt eine gute Antwort. Hat eine gute Frage, um eine gute Antwort zu bekommen. Das Lesen von [FAQ] (http://stackoverflow.com/faq) tut nicht weh. –

Antwort

6

Keine Delegiertenmethoden wie UITableviewController für UICollectionViewController bereitgestellt. Wir können das manuell tun, indem wir UICollectionView einen langen Gestenerkenner hinzufügen.

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self 
                         action:@selector(activateDeletionMode:)]; 
longPress.delegate = self; 
[collectionView addGestureRecognizer:longPress]; 

In LongGesture-Methode Schaltfläche für diese bestimmte Zelle hinzufügen.

- (void)activateDeletionMode:(UILongPressGestureRecognizer *)gr 
{ 
    if (gr.state == UIGestureRecognizerStateBegan) { 
     if (!isDeleteActive) { 
     NSIndexPath *indexPath = [collectionView indexPathForItemAtPoint:[gr locationInView:collectionView]]; 
     UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath]; 
     deletedIndexpath = indexPath.row; 
     [cell addSubview:deleteButton]; 
     [deleteButton bringSubviewToFront:collectionView]; 
     } 
    } 
} 

In dieser Schaltfläche Aktion,

- (void)delete:(UIButton *)sender 
{ 
    [self.arrPhotos removeObjectAtIndex:deletedIndexpath]; 
    [deleteButton removeFromSuperview]; 
    [collectionView reloadData]; 
} 

ich denke, es kann Ihnen helfen.

+0

'[deleteButton bringSubviewToFront: collectionView];' scheint ein Fehler zu sein. –

30

UICollectionView wird animieren und die Zellen nach dem Löschen automatisch neu anordnen.

Löschen ausgewählte Elemente aus der Sammlung Ansicht

[self.collectionView performBatchUpdates:^{ 

    NSArray *selectedItemsIndexPaths = [self.collectionView indexPathsForSelectedItems]; 

    // Delete the items from the data source. 
    [self deleteItemsFromDataSourceAtIndexPaths:selectedItemsIndexPaths]; 

    // Now delete the items from the collection view. 
    [self.collectionView deleteItemsAtIndexPaths:selectedItemsIndexPaths]; 

} completion:nil]; 



// This method is for deleting the selected images from the data source array 
-(void)deleteItemsFromDataSourceAtIndexPaths:(NSArray *)itemPaths 
{ 
    NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet]; 
    for (NSIndexPath *itemPath in itemPaths) { 
     [indexSet addIndex:itemPath.row]; 
    } 
    [self.images removeObjectsAtIndexes:indexSet]; // self.images is my data source 

} 
+0

Löschzeit der Zelle ist behoben, wie Animation langsam oder schnell zu machen. –

+0

Sie müssen die UICollectionViewFlowLayout-Klasse ableiten. Implementieren Sie insbesondere finalLayoutAttributForItemAtIndexPath. Überprüfen Sie [diese] (http://stackoverflow.com/questions/16690831/uicollectionview-animations-insert-delete-items) –