2017-02-21 2 views
0

Независимо от того, что я делаю, я всегда получаю эту ошибку.Swift 3: непризнанный селектор, отправленный в экземпляр для распознавателя жестов

Это внутри моей cellForItemAtIndexPath функции:

cell.postCell.profileImage.userView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "pressedUserImage:")) 

и метод действия:

func pressedUserImage(userView: UIImageView) { 
    print(userView.superview) // error happens here. 

Теперь, конечно, мой UserView находится в глубокой иерархии представлений, но она до сих пор работает. По какой-то причине это не так. Даже если я делаю userImage.superview?.superview и т. Д., Я все равно получаю сообщение об ошибке. Вместо этого я попытался использовать #selector(pressedUserImage(_:), но не повезло. Пробовал Selector("pressedUserImage:"). Ничего.

В каком месте я ошибаюсь?

Update, вот cellForItemAtIndexPath функция:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellID", for: indexPath) as! Posts 
    cell.postCell.profileImage.userView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "pressedUserImage:")) 
    cell.postCell.buttonView.sharePost.addTarget(self, action: #selector(pressedShareButton), for: .touchUpInside) 

    return cell 
} 

postCell в основном UIView, который содержит изображение, название, текст.

Вот ошибка:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[project.Posts pressedUserImage]: unrecognized selector sent to instance 0x7a9a65e0'

+0

вы можете поделиться 'функцию cellForItemAtIndexPath'? – ystack

+1

Можете ли вы также указать текст сообщения об исключении – Paulw11

+1

Параметр для обработчика распознавателя жестов - это распознаватель жестов, без касания. Используйте .view на отправителе, чтобы получить отправку. – vacawama

ответ

3

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

Как:

func pressedUserImage(_ sender: UITapGestureRecognizer) { ... } 
+2

И тогда вы можете получить представление следующим образом: 'if let userView = sender.view as? UIImageView {// используйте userView} ' – vacawama

+0

!!!!!! теперь я должен пойти в Home Depot, чтобы купить сухой цемент. Спасибо, парни! Это сработало. –

0

Как Иисус указал, ваша функция подписи не так. Вам необходимо правильно установить тип параметра и добавить символ подчеркивания, чтобы сделать параметр неименованным.

В дополнение к его изменениям, вы должны также пометить функцию как Objective-C, если ваш класс не является классом Objective-C:

@objc func pressedUserImage(_ sender: UITapGestureRecognizer) { ... } 
+0

Думаю, я смутил его с помощью UIButtons! –

+1

"вы также должны отметить функцию Objective-C, если ваш класс не является классом Objective-C". Зачем? Где объективно-сходит куда-нибудь в вопросе? – Gruntcakes

+0

Селекторы представляют собой конструкцию Objective-C. Для того чтобы среда выполнения могла достичь функции с помощью селектора, она должна использовать диспетчеризацию стиля Objective-C. –

Смежные вопросы