2013-03-25 3 views
7

Ich baue meine erste Anwendung mit UICollectionView und bemerkte, dass es nicht viel gibt, was ich in Bezug auf das Löschen von Objekten tun kann. Für UITableView Anwendungen gibt es die Swipe löschen Methode:UICollectionZum Löschen von Zellen (entspricht CommitEditingStyle)?

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
if (editingStyle == UITableViewCellEditingStyleDelete) { 
     // Delete the row from the data source 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } 

} 

Wenn ich GMGridView verwenden, ist es Verhaltensweisen ähnlich wie lange drücken auf dem iPhone Home-Bildschirm hat - die Ansicht Sterne und eine Löschtaste schütteln angezeigt werden können, die ist verantwortlich für das Löschen der Ansicht. Ich kann sicherlich versuchen, dieses Verhalten zu replizieren, bin mir aber nicht sicher, ob die Benutzer es "bekommen".

Ich habe Interesse an , was meine Optionen sind für die Vermietung der Benutzer Objekte löschen von UICollectionView - muss ich meine eigene löschen Gesten/Kontrollen implementieren, oder gibt es etwas, das ich (oder Open Source) bin fehlt ?

+3

Je mehr ich mit UICollectionView arbeite, desto mehr erkenne ich, wie ausgereift UITableView ist ... – jrturton

Antwort

7

ich diesen Code in meiner Ansicht-Controller eingesetzt, die die Collection enthält und es auf diese Weise tat. Wahrscheinlich machen Sie mit der Antipp-Geste bereits so etwas, um die ausgewählte Zelle zu erkennen.

- (IBAction)didLongPressCellToDelete:(UILongPressGestureRecognizer*)gesture { 
CGPoint tapLocation = [gesture locationInView:self.myCollectionView]; 
NSIndexPath *indexPath = [self.myCollectionView indexPathForItemAtPoint:tapLocation]; 
if (indexPath && gesture.state == UIGestureRecognizerStateBegan) { 
    NSLog(@"image with index %d to be deleted", indexPath.item); 
    self.itemToBeDeleted = indexPath.item; 
    UIAlertView *deleteAlert = [[UIAlertView alloc] 
          initWithTitle:@"Delete?" 
          message:@"Are you sure you want to delete this image?" 
          delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Yes", nil]; 
    [deleteAlert show]; 

} 
} 


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
NSLog(@"selected button index = %d", buttonIndex); 
if (buttonIndex == 1) { 
    // Do what you need to do to delete the cell 
    [self.myCollectionView reloadData]; 
} 
} 
+0

Was ist das 'self.itemToBeDeleted'? – iPeter

+0

self.itemToBeDeleted wird auf den Index des Elements gesetzt, das der Benutzer löschen möchte. – RawMean

+0

Bekam das! :) @RawMean – iPeter

6

Standard UICollectionViewCell hat nur eine leere Ansicht (kein Titel, keine Löschtaste, kein Imageview)

Unterklasse UICollectionViewCell und fügen Sie auf löschen Taste. setHidden = NO, wenn Sie es angezeigt werden soll (Bsp. Nach unten wischen)

Benutzerdefinierte Delegaten Daten zu entfernen und neu zu laden Collection

Beispiel Verwendung Swipe rechts UICollectionViewCell blättern vertikal in der Storyboard zu löschen:

//Cell.h 
@class MyCell; 
@protocol MyCellDelegate 
-(void)deleteButtonClick:(MyCell *)cell; 
@end 
@interface MyCell : UICollectionViewCell 
@property (weak , nonatomic) id<MyCellDelegate> delegate; 
@property (weak,nonatomic) IBOutlet *delButton; 
@end 

//Cell.m 
-(void)awakeFromNib{ 
    [self.delButton setHidden:YES] 
    //add Swipe right to here 
} 
-(void)handleSwipeRight:(UISwipeGestureRecognizer *)swipe { 
    [self.delButton setHidden:NO]; 
} 
-(IBAction)clickDelBut{ 
[self.delegate deleteButtonClick:self]; 
} 

//ViewController.m 
//In cellForItemsAtIndexPath cell.delegate = self. 

-(void)deleteButtonClick:(MyCell *)cell{ 
    //get indexPath, delete data and reload collectionView here 
} 
+0

Meine Sorge ist, dass meine Sammlung Ansicht vertikal scrollt, so dass die Wischbewegung nicht funktionieren würde. Vielleicht ist das der Grund, warum es keinen Swipe zum Löschen gibt - weil das Erziehen des Benutzers, um in eine Richtung zu wischen oder lang zu drücken, zu viel Aufwand ist. –

0

Was ich gefunden habe und implementieren, um Dinge in einer UICollectionView zu löschen und zu bearbeiten, sind von diesem Blogpost.

Grundsätzlich zeigen das Menü für Kopieren/Einfügen ect, und Hinzufügen eigener Aktionen zum Löschen. Es ähnelt der Antwort von iSang, ohne Gestenerkenner hinzuzufügen, die in UICollectionViews nicht so gut funktionieren.

Es verwendet die lange Druckgeste, die Benutzer bereits verwendet haben, um Menüs zu bearbeiten, wenn Sie Text und Links in anderen Teilen von iOS kopieren und einfügen möchten.

http://paulsolt.com/2012/11/uicollectionview-custom-actions-and-uimenucontroller/

0

Für alle, dies in Zukunft zu lesen, hier ist eine nützliche Bibliothek, die ich verwendet haben: https://github.com/Raizlabs/RZUtils/tree/master/RZUtils/Components/RZCollectionTableView

Es ahmt eine UITableView ein UICollectionView verwenden, so dass Sie die Flexibilität der Sammlung Ansicht bekommen kann mit all die netten Bearbeitungsfunktionen, die mit einem UITableView geliefert werden.

Wenn Sie versuchen, eine andere Art von Löschverhalten oder anderes Layout zu implementieren, obwohl, soweit ich weiß, Sie es von Grund auf neu implementieren müssen. Wenn Sie neue Dinge mit UIGestureRecognizers machen, würde ich dieses Tutorial empfehlen: http://www.raywenderlich.com/6567/uigesturerecognizer-tutorial-in-ios-5-pinches-pans-and-more

Hoffe, dass hilft!