UIActionSheet отображается только один раз
У меня есть следующий код, который производит UICollectionView. Когда вы продолжаете нажимать на UICollectionViewCell, появляется UIActionSheet.
Это работает, но только один раз. Если вы отклоните UIActionSheet и снова нажмете одну и ту же ячейку, ничего не произойдет.
Есть идеи, что я делаю не так?
#import "ProjectsListViewController.h"
#import <QuartzCore/QuartzCore.h>
@interface ProjectsListViewController ()
@end
@implementation ProjectsListViewController
@synthesize appDelegate;
- (void)viewDidLoad
{
[super viewDidLoad];
appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
// CREATE THE COLLECTION VIEW
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
[self setCollectionView:[[UICollectionView alloc] initWithFrame:CGRectMake(20, 54, [[self view] bounds].size.width - 40, [[self view] bounds].size.height) collectionViewLayout:flowLayout]];
[[self collectionView] setDataSource:self];
[[self collectionView] setDelegate:self];
[self.view addSubview:self.collectionView];
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"];
[[self collectionView] setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
}
- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section
{
return [[[appDelegate userSettingsDictionary] objectForKey:@"Projects"] count];
}
- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView
{
return 1;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
// CREATE A BACKGROUND VIEW FOR THE FOLDER IMAGE
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"folder.png"]];
UIView *background = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 122, 89)];
[background setBackgroundColor:[UIColor colorWithPatternImage:image]];
[cell addSubview:background];
// SET THE CELL TEXT
UILabel *cellLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 95, 130, 100)];
[cellLabel setText:[[[[[appDelegate userSettingsDictionary] objectForKey:@"Projects"] objectAtIndex:[indexPath row]] objectForKey:@"Project Name"] uppercaseString]];
// LISTEN FOR A LONG PRESS ON EACH FOLDER
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
[cell addGestureRecognizer:longPress];
[cell addSubview:cellLabel];
return cell;
}
// PRESENT AN ACTION SHEET WHEN A FOLDER HAS RECEIVED A LONG PRESS EVENT
- (void)handleLongPress:(UILongPressGestureRecognizer *)recognizer
{
if ( [recognizer state] == UIGestureRecognizerStateBegan )
{
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Select an action" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete" otherButtonTitles:@"Edit", nil];
[actionSheet addGestureRecognizer:recognizer];
// SET THE SELECTED FOLDER'S ROW NUMBER AS THE ACTIONSHEET TAG. JUST A WAY OF LETTING THE DELETE METHOD KNOW WHICH FOLDER TO DELETE
[actionSheet showInView:self.view];
}
}
// GET THE SIZE OF THE FOLDER IMAGE AND SET EACH COLLECTION VIEW ITEM SIZE TO FIT
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"folder.png"]];
return CGSizeMake(image.size.width, image.size.height + 50);
}
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
return UIEdgeInsetsMake(10, 10, 90, 10);
}
@end
Спасибо
2 ответа
Я на самом деле пробовал нечто подобное некоторое время назад и понял, что почти весь подход был неправильным.
Для начала: способ, которым вы настраиваете свои клетки, не очень хорош. Поскольку ячейки можно использовать повторно, но теперь вы добавляете подпредставления каждый раз, когда представление коллекции запрашивает определенную ячейку. Вы должны подкласс UICollectionViewCell
и добавить подпредставления в initWithCoder:
метод.
Затем просто создайте свойство в подклассе для текстового поля. Тогда в collectionView:cellForItemAtIndexPath:
вы просто устанавливаете текст на ярлыки text
имущество.
Теперь давайте исправим распознаватель жестов. Вы не должны устанавливать распознаватель жестов для каждого UICollectionViewCell
, но только один глобальный. В viewDidLoad:
Вы должны добавить:
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
[self.collectionView addGestureRecognizer:longPress];
Тогда вы должны изменить handleLongPress:
что-то вроде этого:
- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture {
if (gesture.state == UIGestureRecognizerStateBegan) {
NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:[gesture locationInView:self.collectionView]];
if (indexPath != nil) {
self.currentIndexPath = indexPath;
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Select an action" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete" otherButtonTitles:@"Edit", nil];
UICollectionViewCell *itemCell = [self.collectionView cellForItemAtIndexPath:indexPath];
[action showFromRect:CGRectMake(0, 0, itemCell.frame.size.width, itemCell.frame.size.height) inView:itemCell animated:YES];
}
}
}
Обратите внимание, что я не добавил строку для добавления распознавателя на лист действий, я не понимаю, почему вы должны это сделать. И вы также должны добавить свойство с именем currentIndexPath
,
Все должно быть настроено прямо сейчас. Когда вы получите ответ от вашего листа действий, просто используйте self.currentIndexPath
определить, какой элемент удалить / отредактировать.
В handleLongPress:
Вы назначаете распознаватель жестов на лист действий.
[actionSheet addGestureRecognizer:recognizer];
Я не знаю, почему вы это делаете, но распознаватель жестов может использоваться только с одним представлением. Это назначение, вероятно, удаляет распознаватель жестов из ячейки табличного представления, поэтому длительный жест нажатия на ячейку таблицы больше не работает.