2017-08-15 14 views
0

ImageViewサブクラスでジェスチャ認識器を定義していますが、ViewControllerでメソッドを呼び出すと "認識できないセレクタ"ジェスチャは、VCでジェスチャを定義すると機能しますが、カスタムビュークラスにコードを入れてクラッタを減らそうとしています。ImageViewサブクラスでジェスチャ認識器を定義していますが、ViewControllerのメソッドを呼び出すと "認識できないセレクタ"がクラッシュします。

これは可能ですか?その後、

class DetailPhotoImageView: UIImageView { 

func setupGestures(){ 

    let tapped = UITapGestureRecognizer(target: self, action: #selector(TripDetailVC.tapped(_:))) 
    tapped.numberOfTapsRequired = 2 

    addGestureRecognizer(tapped) 

    } 
} 

とのVCに私がimageView.setupGestures()

func tapped(_ gesture:UIGestureRecognizer) { 
    if let tapGesture = gesture as? UITapGestureRecognizer { 
     switch tapGesture.numberOfTapsRequired { 
     case 2: 
      print("Worked") 
     default: 
      break 
     } 
    } 
} 

答えて

1

すべきではないと思う、彼らは正しいです、あなたもこのことについて、別の、省スペースの道を行くことができるはずです。パラメータとしてのViewControllerを渡し、ターゲットとして設定します:

class DetailPhotoImageView: UIImageView, UIGestureRecognizerDelegate { 

    func setupGestures(_ target: UIViewController) { 
     guard let aTarget = target as? MyViewController else { return } 

     let tap = UITapGestureRecognizer(target: aTarget, action: #selector(aTarget.someAction(_:))) 
     tap.delegate = self 
     tap.numberOfTapsRequired = taps 
     addGestureRecognizer(tap) 
    } 
} 

そして、あなたのViewControllerクラス:

detailPhoto.setupGestures(self) 
+1

これは私が探していた答えです。ありがとうございました。私は代表者が違いを作ったと思う。 –

1

ジェスチャーになりますあなたのUIImageViewのためのプロトコルを作成し、この機能を持っており、呼び出し:これは私がやっているものです代理人としてあなたのViewControllerを設定する(だけでなく、パラメータとしてImageViewのを持つことはちょうど良い練習..または一般的です):

protocol DetailPhotoDelegate { 
    func detailPhoto(_ detailPhoto: DetailPhotoImageView, actionFor gesture: UITapGestureRecognizer) 
} 

はあなたにUIImageViewサブクラスをデリゲート変数を追加し、プロトコルをプリフォームビューがタップされたときに機能します。また、UIImageViewがUIGestureRecognizerDelegateであることを確認してください。

class DetailPhotoImageView: UIImageView, UIGestureRecognizerDelegate { 

    var delegate: DetailPhotoDelegate? 

    func setupGestures() { 
     let tap = UITapGestureRecognizer(target: self, action: #selector(someAction(_:))) 
     tap.delegate = self 
     tap.numberOfTapsRequired = taps 
     addGestureRecognizer(tap) 
    } 

    func someAction(_ guesture: UITapGestureRecognizer) { 
     print("tap - subclass func") 
     guard let aDelegate = aDelegate else { assertionFailure(); return } 

     delegate.detailPhoto(self, actionFor: gesture) 
    } 
} 

次に、あなたのViewControllerにプロトコルを追加し、(例えば、私はのviewDidLoad(でそれをやった))どこか前に実施されているアクションにごDetailPhotoImageViewのデリゲートとして設定し、あなたが望むしかし、プロトコルのメソッドを実装します。

class ViewController: UIViewController, DetailPhotoDelegate { 

    @IBAction weak var detailPhoto: DetailPhotoImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     detailPhoto.delegate = self 
    } 

    // Mark: DetailPhotoDelegate 
    func detailPhoto(_ detailPhoto: DetailPhotoImageView, actionFor guesture: UITapGestureRecognizer) { 

     switch guesture.numberOfTapsRequired { 
     case 1: print("1 tap"); return 
     case 2: print("2 taps"); return 
     default: print("\(guesture.numberOfTapsRequired) taps"); return 
     } 
    } 
+0

私はそれが動作することを疑問に言いました。なぜ私はそれを回避しようとしているのかという質問でも述べました。 –

+0

申し訳ありませんが、これを見て、回答を更新 – moni15

+0

@CodyLucas更新 – moni15

0

私はターゲットがそうランドール王の提案のオフに行くの自己

関連する問題