Как добавить распознаватель жестов в UIImage и UIButton UITableViewCell? - PullRequest
0 голосов
/ 22 марта 2019

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

*** Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [UIButton nameOfuserTappedWithGestureRecgonizer:]: нераспознанный селектор отправлен экземпляр 0x7ff34253f5a0 '

protocol MediaTableViewCellDelegate: class {

    func didClickProfileImageOf(cell: MediaTableViewCell)
    func didClickProfileNameOf(cell: MediaTableViewCell)
}

class MediaTableViewCell: UITableViewCell {


    weak var delegate: MediaTableViewCellDelegate?

      @IBOutlet weak var mediaImageView: UIImageView! //the large image
      @IBOutlet weak var profileImageView: UIImageView!
      @IBOutlet weak var fullNameButton: UIButton!

       var tapGestureRecognizerProfileImage = UITapGestureRecognizer()
       var tapGestureRecognizerProfileName = UITapGestureRecognizer()



override func awakeFromNib() {
        super.awakeFromNib()
         initialize()
    }
     private func initialize() {

      tapGestureRecognizerProfileImage.addTarget(self.profileImageView, action: #selector(MediaTableViewCell.imageTapped(gestureRecgonizer:)))
      self.addGestureRecognizer(tapGestureRecognizerProfileImage)

      tapGestureRecognizerProfileName.addTarget(self.shareButton, action: #selector(MediaTableViewCell.nameOfuserTapped(gestureRecgonizer:)))
      self.addGestureRecognizer(tapGestureRecognizerProfileName)
   }

     func imageTapped(gestureRecgonizer: UITapGestureRecognizer) {
        delegate?.didClickProfileImageOf(cell: self)
  }

   func nameOfuserTapped(gestureRecgonizer: UITapGestureRecognizer) {
     delegate?.didClickProfileNameOf(cell: self)
 }

}//end class

Ответы [ 3 ]

2 голосов
/ 23 марта 2019

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

Кнопкам не требуется распознаватель жестов, поскольку они являются подклассами из UIControl.

private func initialize() {
    let imageTapGesture = UITapGestureRecognizer(target: self, action: #selector(profileTapped))
    profileImageView.addGestureRecognizer(imageTapGesture)
    // imageviews by default aren't interactable
    profileImageView.isUserInteractionEnabled = true 

    fullNameButton.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
}

@objc private func profileTapped() {
    delegate?.didClickProfileImageOf(cell: self)
}

@objc private func buttonTapped() {
    delegate?.didClickProfileNameOf(cell: self)
}

- Обновлено за комментарий -

protocol MediaTableViewCellDelegate: class {
    func mediaTableViewCell(_ cell: MediaTableViewCell, didClickProfileImage: Bool)
    func mediaTableViewCell(_ cell: MediaTableViewCell, didClickProfileName: Bool)
}
0 голосов
/ 23 марта 2019

Я думаю, что вы не должны добавлять UIGestureRecognizer для кнопки, потому что она уже имеет сенсорное событие.

Просто добавьте этот код для кнопки:

fullNameButton.addTarget(self, action: #selector(some selector), for: .touchUpInside)

Что касается profileImageView, добавьте следующие строки кода:

let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(some selector)) 
profileImageView.isUserInteractionUnabled = true
profileImageView.addGestureRecognizer(tapRecognizer)
0 голосов
/ 22 марта 2019

Вы смешиваете аргумент addTarget с вызывающим addGestureRecognizer.

Целью addTarget распознавателя жестов является класс, который реализует селектор (закрытие, переданное как action).В данном случае это self.

addGestureRecognizer добавляет распознаватель к самому представлению.

Итак, вы хотите:

tapGestureRecognizerProfileImage.addTarget(self, action: #selector(MediaTableViewCell.imageTapped(gestureRecgonizer:)))

self.profileImageView.addGestureRecognizer(tapGestureRecognizerProfileImage)
...