2013-03-25 11 views
7

Buduję swoją pierwszą aplikację przy użyciu UICollectionView i zauważyłem, że niewiele mogę zrobić, jeśli chodzi o usuwanie obiektów. Dla UITableView aplikacji, nie ma swipe usunąć metoda:UICollectionView usunąć komórki (odpowiednik 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]; 
    } 

} 

Gdy używam GMGridView, ma zachowań podobnych do długim naciśnięciu na ekranie głównym telefonu iPhone - widok gwiazd wstrząsnąć i przycisk usuwania mogą być wyświetlane, który jest odpowiedzialny za usunięcie widoku. Mogę na pewno spróbować replikować to zachowanie, ale nie jestem pewien, czy użytkownicy "to dostaną".

Jestem zainteresowany jakie są moje możliwości pozwalając użytkownikowi usuwanie obiektów z UICollectionView - muszę wdrożyć własne usuwać gesty/kontroli, czy jest tam coś, co mi brakuje (lub open source) ?

+3

Im więcej pracuję z UICollectionView, tym bardziej uświadamiam sobie, jak dojrzały jest UITableView ... – jrturton

Odpowiedz

7

I dodaje ten kod moim zdaniem regulatora, który zawiera CollectionView i zrobił to w ten sposób. Prawdopodobnie już robisz coś takiego za pomocą gestu dotykowego, aby wykryć wybraną komórkę.

- (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

Co to jest 'self.itemToBeDeleted'? – iPeter

+0

self.itemToBeDeleted jest ustawiony na indeks elementu, który użytkownik chce usunąć. – RawMean

+0

Mam to! :) @RawMean – iPeter

6

Domyślnie UICollectionViewCell ma tylko widok pustego (bez tytułu, bez kasowania przycisku, bez ImageView)

podklasę UICollectionViewCell i dodać przycisk delete na nim. setHidden = NIE, jeśli chcesz, aby go wyświetlić (. Ex przesuń w dół)

Wykorzystanie niestandardowych delegata usunąć dane i przeładować CollectionView

Sample użycie bezstykowa prawo do usunięcia UICollectionViewCell przewijania w pionie Storyboard:

//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

Moją obawą jest to, że mój widok kolekcji przewija się w pionie, więc przesunięcie w dół nie będzie działać. Może dlatego nie ma machnięcia, aby usunąć - ponieważ uczenie użytkownika przesuwania w jakimś kierunku lub długiego naciśnięcia jest zbyt dużym wysiłkiem. –

0

Co znalazłem i wdrażam do usuwania i edycji rzeczy w UICollectionView pochodzą z tego wpisu na blogu.

Pokazywanie menu kopiowania/wklejania i dodawanie własnych czynności do usunięcia. Jest podobny do odpowiedzi iSanga, bez dodawania identyfikatorów gestów, które nie działają zbyt dobrze w UICollectionViews.

Używa długiego naciśnięcia klawisza, który ludzie już używali do wywoływania menu edycji, gdy chcą skopiować i wkleić tekst i linki w innych częściach iOS.

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

0

Dla każdego, kto czyta to w przyszłości, tutaj jest przydatna biblioteka Używam: https://github.com/Raizlabs/RZUtils/tree/master/RZUtils/Components/RZCollectionTableView

To naśladuje UITableView przy użyciu UICollectionView, dzięki czemu można uzyskać elastyczność widzenia gromadzenia się wszystkie ładne funkcje edycji, które są dostarczane z UITableView.

Jeśli próbujesz zaimplementować inny rodzaj zachowania lub inny układ, o ile wiem, musisz go zaimplementować od zera. Jeśli nie masz doświadczenia w robieniu niestandardowych rzeczy za pomocą UIGestureRecognizers, polecam ten samouczek: http://www.raywenderlich.com/6567/uigesturerecognizer-tutorial-in-ios-5-pinches-pans-and-more

Mam nadzieję, że to pomoże!

Powiązane problemy