2017-02-21 14 views
0

私が何をしても、私はいつもこのエラーを受け取ります。スイフト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:")。何もない。

ここで私は間違っていますか?

アップデートは、ここに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'機能を共有することができます:あなたのクラスは、Objective-Cのクラスではない場合は、彼の変化に加えて

は、あなたはまた、Objective-Cのよう機能にフラグを付けなければなりませんか? – ystack

+1

正確な例外メッセージのテキストも表示できます – Paulw11

+1

ジェスチャ認識プログラムハンドラのパラメータは、ジェスチャ認識プログラムです。タッチされたビューはありません。送信ビューを取得するには、送信者の.viewを使用します。 – vacawama

答えて

3

問題は、あなたの関数のシグネチャであるように見えます。ジェスチャ認識プログラムをパラメータとして受け入れる必要があります。

同様:

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

そして、次のようなビューを得ることができます: 'let userView = sender.view as? UIImageView {// use userView} ' – vacawama

+0

!!!!!!今、私はホームデポに行き、乾いた壁のセメントを購入しなければなりません。みんなありがとう!出来た。 –

0

ヨシュアが指摘したように、あなたの関数の署名が間違っていました。パラメータのタイプを正しく設定し、アンダースコアを追加してパラメータの名前を無名にする必要があります。

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

私はUIButtonsと混同していると思います! –

+1

"クラスがObjective-Cクラスでない場合は、Objective-Cとして関数にフラグを立てるべきです"。どうして?客観的なCがどこに問題になっていますか? – Gruntcakes

+0

セレクタはObjective-C構造です。セレクタを使用してランタイムが関数に到達できるようにするには、Objective-Cスタイルのディスパッチを使用する必要があります。 –

関連する問題