2013-03-25 2 views
7

Я строю свое первое приложение, используя UICollectionView, и заметил, что я не могу сделать это с точки зрения удаления объекта. Для UITableView приложений, есть салфетки, чтобы удалить метод:UICollectionView Как удалить ячейки (эквивалент 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]; 
    } 

} 

Когда я использую GMGridView, то есть поведение, аналогичное долгое нажатие на главном экране iPhone - взгляд звезды дрожать и кнопку удаления может быть отображен, который отвечает за удаление представления. Я могу, конечно, попытаться воспроизвести это поведение, но не уверен, что пользователи «получат его».

Я заинтересован в каковы мои варианты позволяя пользователю удалить объекты из UICollectionView - я должен реализовать свои собственные жесты удаления/управления, или есть что-то, что я пропавшими без вести (или с открытым исходным кодом) ?

+3

Чем больше я работаю с UICollectionView, тем больше я понимаю, насколько зрелым UITableView является ... – jrturton

ответ

7

Я вставил этот код на мой взгляд контроллера, который включает в себя CollectionView и сделал это таким образом. Вероятно, вы уже делаете что-то подобное с жестом нажатия, чтобы обнаружить выбранную ячейку.

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

Что это за 'self.itemToBeDeleted'? – iPeter

+0

self.itemToBeDeleted установлен в индекс элемента, который пользователь хочет удалить. – RawMean

+0

Получил это! :) @RawMean – iPeter

6

По умолчанию UICollectionViewCell имеет только пустой вид (без названия, ни кнопки удаления, не ImageView)

подкласс UICollectionViewCell и добавить кнопку удаления на нем. setHidden = NO, если вы хотите, чтобы отобразить его (. Ex проведите пальцем вниз)

Использовать пользовательский делегат для удаления данных и перезагрузить CollectionView

Sample право использовать салфетки для удаления UICollectionViewCell прокрутки по вертикали в раскадровке:

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

Моя забота о том, что мой просмотр коллекции прокручивается вертикально, поэтому прокрутка вниз не будет работать. Возможно, именно поэтому нет никакого удаления, потому что обучение пользователю провести в каком-то направлении или сделать длинный пресс слишком сложно. –

0

Что я нашел и реализую для удаления и редактирования вещей в UICollectionView, из этого сообщения в блоге.

В основном отображает меню для копирования/вставки и добавление моих собственных действий для удаления. Это похоже на ответ iSang, без добавления распознавателей жестов, которые не слишком хорошо работают в UICollectionViews.

Он использует длинный жест нажатия, который люди уже использовали для создания меню редактирования, когда вы хотите копировать и вставлять текст и ссылки в другие части iOS.

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

0

Для тех, кто читает это в будущем, вот полезная библиотека Я использую: https://github.com/Raizlabs/RZUtils/tree/master/RZUtils/Components/RZCollectionTableView

Он имитирует UITableView с помощью UICollectionView, так что вы можете получить гибкость представления коллекции с все приятные функции редактирования, которые поставляются с UITableView.

Если вы пытаетесь реализовать различное поведение при удалении или другой макет, хотя, насколько я знаю, вы должны реализовать его с нуля. Если вы новичок в создании пользовательских вещей с помощью UIGestureRecognizers, я бы рекомендовал этот учебник: http://www.raywenderlich.com/6567/uigesturerecognizer-tutorial-in-ios-5-pinches-pans-and-more

Надеюсь, что это поможет!

Смежные вопросы