Подтвердить что ты не робот

Действие кнопки: UICollectionView Cell

Я создал элемент UICollectionViewCell by nib и добавил в него кнопку, и создал файлы .h и .m, добавив класс к nibs file owner. Затем написал действие кнопки в .m, подключенном через выход.

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

Как я могу получить действие кнопки?

4b9b3361

Ответ 1

У меня тоже была эта проблема. Никакие подвидности не будут получать события касания. В то время как обход Скотта К. работает, я все еще чувствовал, что что-то не так. Поэтому я еще раз взглянул на мой наконечник и заметил, что исходное подвью, которое я использовал для создания UICollectionViewCell, было UIView. Несмотря на то, что я сменил класс на подкласс UICollectionViewCell, XCode по-прежнему считал его UIView, и, следовательно, проблемы, которые вы видите, с ContentView, не захватывающие события касания.

Чтобы исправить это, я перечеркнул нить, убедившись, что перетащил объект UICollectionViewCell и переместил все подпрограммы к этому. Впоследствии сенсорные события начали работать над моими подзонами.

Может быть, индикатор, чтобы увидеть, настроен ли ваш пин, как UICollectionViewCell, смотрите значок для вашего представления высокого уровня.

enter image description here

Если это не похоже на это, то, вероятно, он неправильно интерпретирует события касания.

Ответ 2

Когда вы создаете UICollectionViewCell через наконечник, содержимое ниба не добавляется в содержимое cellView - все это добавляется непосредственно в UICollectionViewCell. Кажется, не существует способа заставить Interface Builder распознавать представление верхнего уровня в UICollectionViewCell как UICollectionViewCell, поэтому все содержимое внутри "автоматически" добавляется в contentView.

Как отметил sunkehappy, все, что вы хотите получать прикосновениями, должно войти в contentView. Он уже создан для вас, так что лучше всего вы можете программно переместить свой UIButton в contentView на awakeFromNib-time.

-(void)awakeFromNib {
    [self.contentView addSubview:self.myButton];
}

Ответ 3

Ссылка на класс UICollectionViewCell

Чтобы настроить внешний вид вашей ячейки, добавьте просмотры, необходимые для представить содержимое элементов данных как подпункты представления в свойство contentView. Не добавляйте субподзовы непосредственно к самой ячейке. Ячейка управляет несколькими уровнями контента, из которых вид содержимого это только один. В дополнение к представлению содержимого, ячейка управляет двумя фоновые представления, отображающие ячейку в выбранных и невыбранные состояния.

Вы можете добавить свою кнопку в awakeFromNib следующим образом:

- (void)awakeFromNib
{
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [self.contentView addSubview:button];
}

- (void)buttonClicked:(id)sender
{
    NSLog(@"button clicked");
}

Ответ 4

Я только что решил это, добавив

[self bringSubviewToFront:myButton];

в awakeFromNib

Ответ 5

У меня была аналогичная проблема, когда subviews в нижней части ячейки не получали события касания, но верхняя часть работала нормально. Поэтому я начал исследовать и получил следующие результаты:

  • Конструктор интерфейсов добавит любые элементы в ячейке, которую вы создаете в нем, в contentView ячейки, даже несмотря на то, что сам ContentView не отображается в построителе интерфейса
  • Мой код расширил ячейки в соответствии с размером содержимого, поэтому большинство ячеек в представлении коллекции имели большую высоту, чем план в Interface Builder
  • По какой-то причине свойство Autoreize subviews для самой ячейки было установлено как NO. Это вызвало таинственный и невидимый в интерфейсе построитель contentView, чтобы он оставался того же размера, что и у ячейки в построителе интерфейса изначально, поэтому любые подзаголовки, выходящие за пределы contentView, не получали штрихов и не реагировали.

Настройка "Подпроцессы Autoresize" ячейки в построителе интерфейса для YES решила мою проблему!

Ответ 6

Мне трудно понять Принятый ответ, я постараюсь дать простой ответ.

В UICollectionViewCell существует два типа.

  1. Коллекция View Cell
  2. Коллекция многоразового просмотра

Я использовал "Повторное использование коллекции", поскольку действия кнопки не работают.

Затем в соответствии с принятым ответом я попытался использовать Cell View Collection, в котором работают только действия кнопки. Используйте второй объект в изображении. Он будет работать нормально.

enter image description here

Ответ 7

Создайте ручку для CollectionView в UICollectionViewCell

В файле .h UICollectionViewCell

@property (nonataomic, retain) UICollectionView *collView;

В файле .m файла UICollectionViewCell

@synthesize *collView;

Затем в файле реализации контроллера в методе foll установите Collection Collection

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
  YourCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:homePageCollViewCellIdentifier forIndexPath:indexPath];
    //NSString *str = [NSString stringWithFormat:@"HP item %d", indexPath.row+1];
    cell.collView = self.theCollectionView;
}

Теперь в реализации вашего UICollectionViewCell

- (void)awakeFromNib
{
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [self.contentView addSubview:button];
}

Теперь в вашем методе Clicked Click

-(void)buttonClicked:(id)sender
{
    NSLog(@"button clicked");
    NSIndexPath *indPath = [collVw indexPathForCell:self];    
    [collVw.delegate collectionView:self.collVw didSelectItemAtIndexPath:indPath];
}