UITapGestureRecognizer无法在自定义类(不是视图控制器)内部工作

时间:2016-09-16 13:47:24

标签: ios swift

我有一个自定义类Overlay,我添加了UIButton。单击该按钮时,应调用一个方法:

class Overlay {

func show(onView view: UIView, frame: CGRect) {
    let dismissButton = UIButton()
        dismissButton.frame = frame
        dismissButton.setTitle("Dismiss", for: .normal)
        dismissButton.setTitleColor(Project.Color.failure, for: .normal)
        dismissButton.titleLabel?.font = Project.Typography.lightFont.withSize(22)
        view.addSubview(dismissButton)

        dismissButton.isUserInteractionEnabled = true

        let tap = UITapGestureRecognizer(target: self, action: #selector(dismissBtnTapped(tap:)))
        dismissButton.addGestureRecognizer(tap)
}

@objc func dismissBtnTapped(tap: UITapGestureRecognizer) {
    print("TEST")
}

我在我的ViewController中调用show(...),传入其视图和框架。

但tapGestrueRecognizer无效。有什么想法吗?

谢谢。

编辑:我尝试将此代码直接放在我的ViewController中。然后它工作。我不知道为什么,不幸的是,这对我来说不是一个可行的解决方案:/

编辑2: 这就是我所说的:

let overlay = Overlay()
overlay.show(onView: self.view, frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: 150))

5 个答案:

答案 0 :(得分:1)

您无需在tapgesturerecognizer上添加uibutton,您可以直接在其上添加目标,例如

   dismissButton.addTarget(self, action: #selector(dismissBtnTapped), forControlEvents: .TouchUpInside)

并从dismissBtnTapped方法中删除参数!

答案 1 :(得分:1)

您已添加按钮尝试向其添加目标而非手势, 并使你的叠加变量全局化。

class YourControllerClass: UIViewController {
let overlay = Overlay()
...
func show(onView: UIView, frame: CGRect) {
...
dismissButton.addTarget(self, action: #selector(dismissBtnTapped(_:)), forControlEvents: .TouchUpInside)
}

func dismissBtnTapped(sender:UIButton){

}
}

希望这有帮助。

答案 2 :(得分:0)

确保您在view方法中以onView传递的show(onView: UIView, frame: CGRect)已启用用户互动。

答案 3 :(得分:0)

以我的脚本为例

第1步

class MyIcon {

var targetController = UIViewController()

func show(_ targetController:UIViewController, _ view: UIView, _ frame: CGRect) {

    self.targetController = targetController

    let icon = UIImageView()
    icon.frame = frame
    icon.image = UIImage(named: "image_user.png")
    icon.isUserInteractionEnabled = true
    view.addSubview(icon)

    let tap = UITapGestureRecognizer(target: self.targetController, action: #selector(iconTapped))
    icon.addGestureRecognizer(tap)
}

@objc func iconTapped(_ icon: UIImageView) {
    print("Yo hoo! This worked!")
}
}

第2步

class MyController: UIViewController{
    let myicon = MyIcon()

    override func viewDidLoad() {
        super.viewDidLoad()
        myicon.show(self, self.view, self.view.frame)
    }

 @IBAction func iconTapped(_ icon: UIImageView){
       myicon.iconTapped(icon)
    }

}

答案 4 :(得分:0)

以上都不是解决问题的方法。 关键是,如果您在事件内部创建自定义类的实例,则该事件完成后将被删除,因为该实例与应用程序中的任何持久性元素均不相关。因此,您必须将类的对象实例化为超级视图的属性。