Действие кнопки: UICollectionView Cell
Я создал элемент UICollectionViewCell
by nib и добавил в него кнопку, и создал файлы .h и .m, добавив класс к nibs file owner
. Затем написал действие кнопки в .m, подключенном через выход.
Вид коллекции заполняется штрафом, но не может вызвать срабатывание бутона.
Я думаю, делегат для коллекции ячейки называется.
Как я могу получить действие кнопки?
Ответы
Ответ 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 существует два типа.
- Коллекция View Cell
- Коллекция многоразового просмотра
Я использовал "Повторное использование коллекции", поскольку действия кнопки не работают.
Затем в соответствии с принятым ответом я попытался использовать 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];
}