代码之家  ›  专栏  ›  技术社区  ›  Cody Lucas

我在ImageView子类中定义手势识别器,但在ViewController中调用方法会与“Unrecogned selector”崩溃

  •  0
  • Cody Lucas  · 技术社区  · 8 年前

    我在ImageView子类中定义手势识别器,但在ViewController中调用方法会与“Unrecogned selector”崩溃。如果我在VC中定义手势,手势就可以工作,但我正试图将代码放在自定义视图类中,以减少混乱。

    class DetailPhotoImageView: UIImageView {
    
    func setupGestures(){
    
        let tapped = UITapGestureRecognizer(target: self, action: #selector(TripDetailVC.tapped(_:)))
        tapped.numberOfTapsRequired = 2
    
        addGestureRecognizer(tapped)
    
        }
    }
    

    然后在VC中,我有这个函数,并调用imageView。设置手势()

    func tapped(_ gesture:UIGestureRecognizer) {
        if let tapGesture = gesture as? UITapGestureRecognizer {
            switch tapGesture.numberOfTapsRequired {
            case 2:
                print("Worked")
            default:
                break
            }
        }
    }
    
    3 回复  |  直到 8 年前
        1
  •  1
  •   mmr118    8 年前

    王的建议是对的,你也可以用另一种节省空间的方式。将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)
        }
    }
    

    detailPhoto.setupGestures(self)
    
        2
  •  1
  •   mmr118    8 年前

    为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,在执行操作之前的某个地方将其设置为DetailPhotoImageView的委托(我在viewDidLoad()中进行了此操作),然后按照您的意愿实现协议方法:

    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
            }
        }
    
        3
  •  0
  •   Randall Wang    8 年前

    我认为目标不应该是自我

    推荐文章