2017-01-31 22 views
0

У меня есть этот класс DiaryCell (collectionviewcell), и я пытаюсь добавить распознаватель жестов в этом классе, чтобы вызвать метод коллекцииViewController , который является другим классом.Я получаю эту ошибку, когда пытаюсь добавить TapGestureRecognizer в свой UIImageView: Unrecognized selector, отправленный классу

class DiaryCell: UICollectionViewCell { 
    override init(frame: CGRect) { 
     super.init(frame: frame) 
     setupViews() 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    //imageview for favorite button 
    let favoriteImageView: UIImageView = { 
     let imageView = UIImageView() 
     imageView.image = #imageLiteral(resourceName: "favorite_gray") 
     imageView.contentMode = .scaleAspectFill 
     imageView.clipsToBounds = true 
     return imageView 
    }() 

    //imageview for menu button 
    let menuImageView: UIImageView = { 
     let imageView = UIImageView() 
     imageView.image = #imageLiteral(resourceName: "menu_image") 
     imageView.contentMode = .scaleAspectFit 
     imageView.clipsToBounds = true 
     imageView.isUserInteractionEnabled = true 
     imageView.translatesAutoresizingMaskIntoConstraints = false 
     return imageView 
    }() 
} 

Я пробовал различные стратегии, но я не могу добавить жест распознаватель к menuImageView. Я попытался сделать это, где HomeCollectionViewController - это контроллер, где я хочу обрабатывать действие при нажатии на изображение.

imageView.addGestureRecognizer(UITapGestureRecognizer(target: HomeCollectionViewController.self, action: #selector(HomeCollectionViewController.menuBarPressed)) 
+0

'setupViews()'? что это делает. –

+0

устанавливает ограничения для всей ячейки. Я понятия не имею, почему строка в нижней части моего вопроса не работает. –

+0

Добавили ли вы TapGestureDelegate. Нужно установить его в 'HomeCollectionViewController' –

ответ

0

Проблема в том, что, хотя ваш код является законным и компилируется, это неправильно.

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

Один из способов достижения этой цели - установить слабую ссылку на ваш контроллер в ячейке.

class DiaryCell: UICollectionViewCell { 

    var tapGesture:UITapGestureRecognizer? 
    weak var gestureTarget: HomeCollectionViewController? { 
     didSet { 
      setupGestures() 
     } 
    } 

    func setupGestures() { 

     if let tapGesture = tapGesture { 
      removeGestureRecognizer(tapGesture) 
      self.tapGesture = nil 
     } 

     if let gestureTarget = gestureTarget { 
      let gesture = UITapGestureRecognizer(target: gestureTarget, action: #selector(HomeCollectionViewController.menuBarPressed)) 
      addGestureRecognizer(gesture) 
      tapGesture = gesture 
     } 

    } 

} 

Вы, вероятно, установить gestureTarget в вашем collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell методе

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