UICollectionView как удалить ячейки (эквивалент commitEditingStyle)?

Я создаю свое первое приложение, используя UICollectionView и заметил, что я мало что могу сделать с точки зрения удаления объекта. Для UITableView приложения, есть салфетки для удаления метода:

- (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 - должен ли я реализовать свои собственные жесты/элементы управления delete, или есть что-то, что мне не хватает (или с открытым исходным кодом)?

4 ответов


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

- (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];
}
}

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

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

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

пример используйте салфетки вправо, чтобы удалить 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
}

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

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

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

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


для тех, кто читает это в будущем, вот полезная библиотека, которую я использовал: 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

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