1

Я разработал UICollectionViewCell с использованием XIB, и в этой пользовательской ячейке у меня есть UILabel, взаимодействие с которым я включил.UILabel с индикатором распознавания жесткого диска не работает

В моем viewcontroller, когда я проектирую cell, вот мой код.

UITapGestureRecognizer *buyNowTapped = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(buyNowClicked:)]; 
buyNowTapped.numberOfTapsRequired = 1.0; 
cell.buy.tag = indexPath.row; 
cell.buy.userInteractionEnabled = YES; 
[cell.buy addGestureRecognizer:buyNowTapped]; 

-(void)buyNowClicked : (id)sender 
{ 
    UIButton *button; 
    UILabel *label; 
    if([sender isKindOfClass:[UIButton class]]) 
    { 
     button = (UIButton *)sender; 
     [self buyService:button.tag]; 
    } 
    else if ([sender isKindOfClass:[UILabel class]]) 
    { 
    label = (UILabel *)sender; 
    [self buyService:label.tag]; 
    } 
} 

Но добавленный жест нажатия не работает.

+0

шоу 'buyNowClicked 'функция .. – vaibhav

+0

Проверьте иерархию просмотра меток 'buy', см. Другие представления, не блокирующие ее' userInteraction' –

+0

Я добавил описание –

ответ

1

Мое предложение переделать свой проект и изменить UILabel к UIButton, потому что UIButton просто обрабатывает признание крана, а также вы не имеете любой вопрос метчика пересылается также в UICollectionView (didSelectItemAtIndexPath: будет называться действительно).

Итак, смените ярлык на кнопку и установите метод buyNowClicked: на TouchUpInside событие на нем.

UPDATE: Если вы не можете удалить UILabel по какой-либо причине, то поставить UIButton под UILabel (с таким же frame и в конечном счете NSConstraints) и двигаться buyNowClicked: метод в TouchUpInside события на кнопке, а затем вы выиграете легко

+0

. Я знаю, что это лучше, но у меня есть определенное ограничение по дизайну для этого так. –

+0

@AvinashSharma, хорошо, тогда UIButton под UILabel (с тем же фреймом и в конечном итоге с ограничениями) и переместите buyNowClicked: метод при событии TouchUpInside на кнопке, а затем вы легко выиграете :) – ddb

+0

да, это самый простой способ –

0
  1. Вы должны добавить этот код в свой Пользовательский класс UICollectionViewCell.

  2. Затем создайте делегата, который будет реагировать на краны.

  3. Назначьте делегата в cellForRowAtIndexPath вида коллекции.

дайте мне знать, если вам нужно подробное объяснение.

Edit 1: Код:

MyCell.swift:

import UIKit 

protocol MyCellDelegate { 
    func lblNameTapped(cell: MyCell) 
} 

class MyCell: UICollectionViewCell { 
    @IBOutlet var lblName: UILabel! 
    var lblNameTapRec:UITapGestureRecognizer! 
    var delegate: MyCellDelegate? 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 

     lblNameTapRec = UITapGestureRecognizer(target: self, action: #selector(MyCell.lblNameTapped(_:))) 
     lblName.userInteractionEnabled = true 
     lblName.addGestureRecognizer(lblNameTapRec) 
    } 

    func lblNameTapped(sender: AnyObject){ 
     delegate?.lblNameTapped(self) 
    } 

} 

ViewController.Swift:

import UIKit 

class WallOfPraizeVC: UIViewController,UICollectionViewDataSource,UICollectionViewDelegate,MyCellDelegate { 

    @IBOutlet var collectionView: UICollectionView! 

    //DelegateMethod 
    func lblNameTapped(cell: MyCell) { 
     let indexPath = self.collectionView.indexPathForCell(cell) 
     print(indexPath!.row) 
    } 

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    { 
     let cell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell", forIndexPath: indexPath) as! MyCell 
     cell.delegate = self 
     return cell 
    } 
} 
+0

Но тогда как я узнаю ярлык метки –

+0

You хотите открыть какой-либо View Controller, когда пользователь нажимает на Label? –

+0

Мне нужно вызвать службу по крану, которая должна знать индекс ячейки, который был использован –

1

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

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"%ld", (long)indexPath.row); 
} 

Примечание: добавил TapGestureRecognizer где-то и предотвращает СЕЛЕКТОН ячейки didselectitematindexpath

0

Попробуйте это: -

-(void)buyNowClicked:(UITapGestureRecognizer*)tap 
{ 
    NSLog(@"buyNowClicked here"); 
    [self buyService:tap.view.tag]; 

} 
0

Используйте этот код для крана жест: -

UITapGestureRecognizer *buyNowTapped = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(buyNowClicked:)]; 
    buyNowTapped.numberOfTapsRequired = 1.0; 
    cell.buy.tag = indexPath.row; 
    cell.buy.userInteractionEnabled = YES; 
    [cell.buy addGestureRecognizer:buyNowTapped]; 


    Try this : 

    -(void)buyNowClicked : :(UITapGestureRecognizer*)recognizer 
    { 

     UIView *view = [recognizer view]; 

     NSLog(@"tag %ld",(long)view.tag); 

     UIButton *button; 
     UILabel *label; 

     if([view isKindOfClass:[UIButton class]]) 
     { 
      button = (UIButton *)sender; 
      [self buyService:button.tag]; 
     } 
     else if ([view isKindOfClass:[UILabel class]]) 
     { 
     label = (UILabel *)sender; 
     [self buyService:label.tag]; 
     } 
    }