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