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
надеюсь, что это поможет!