Swift 4 - 将UITapGestureRecognizer添加到子视图图像 - 不调用该方法

Chr*_* G. 13 ios swift

我有以下UITapGestureRecognizer设置,但该方法没有被调用?

注意:它UITapGestureRecognizer被添加到子视图项.

此外,它在添加内部UIGestureRecognizerDelegateSUStepView也有效 - 唯一的问题是我需要在容器中使用它.

class StepViewContainer: NSObject, UIGestureRecognizerDelegate {
var view: SUStepView?

    @objc func tapAction(recognizer: UITapGestureRecognizer) {

    }

    override init(){
        super.init()
        // View
        self.view = Bundle.main.loadNibNamed("SignupV3Views", owner: self, options: nil)![0] as? SUStepView

        let mytapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapAction))
        mytapGestureRecognizer.numberOfTapsRequired = 1
        self.view?.imageView.addGestureRecognizer(mytapGestureRecognizer)            
    }
}
Run Code Online (Sandbox Code Playgroud)

StepViewContainer中的视图:

class SUStepView: UIView {
@IBOutlet weak var imageView: UIImageView!

    @objc public func nextStepTap(sender: UITapGestureRecognizer) {
    }

    override func awakeFromNib() {
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(nextStepTap))
        tapGestureRecognizer.numberOfTapsRequired = 1
        self.imageView.addGestureRecognizer(tapGestureRecognizer)

        self.imageView.isUserInteractionEnabled = true
        self.imageView.layer.masksToBounds = true
        self.imageView.layer.cornerRadius = self.imageView.frame.size.width / 2
        self.imageView.clipsToBounds = true

}
Run Code Online (Sandbox Code Playgroud)

Kir*_*odi 24

Swift 4代码:

TapGesture:

 tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.myviewTapped(_:)))
 tapGesture.numberOfTapsRequired = 1
 tapGesture.numberOfTouchesRequired = 1
Run Code Online (Sandbox Code Playgroud)

ImageView Tap:

    self.imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width/2.0, height: self.view.frame.size.height/2.0))
    self.imageView.isUserInteractionEnabled = true
    self.imageView.backgroundColor = UIColor.red
    self.imageView.layer.masksToBounds = true
    self.imageView.layer.cornerRadius = self.imageView.frame.size.width / 2
    self.imageView.clipsToBounds = true
    self.imageView.isUserInteractionEnabled = true
    self.imageView.addGestureRecognizer(tapGesture)
    self.view.addSubview(self.imageView)
Run Code Online (Sandbox Code Playgroud)

呼叫点击

@objc func myviewTapped(_ sender: UITapGestureRecognizer) {
    if self.imageView.backgroundColor == UIColor.yellow {
        self.imageView.backgroundColor = UIColor.green
    }else{
        self.imageView.backgroundColor = UIColor.yellow
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 因为在Swift 4中,函数不再隐式暴露给Objective-C代码,后者需要能够将其作为选择器调用. (4认同)
  • 为什么我必须在函数之前添加`@objc`? (3认同)

Dix*_*ari 12

试试这个.

let mytapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(myTapAction))
mytapGestureRecognizer.numberOfTapsRequired = 1
self.imageView.addGestureRecognizer(mytapGestureRecognizer)
Run Code Online (Sandbox Code Playgroud)

方法.

@objc func myTapAction(recognizer: UITapGestureRecognizer) {
}
Run Code Online (Sandbox Code Playgroud)

  • @objc应该添加到选择器方法中 (2认同)