点击框架内的手势不起作用
UITapGesture inside Framework not working
我正在尝试创建我的第一个 Cocoapod 框架,需要将一个简单的 UITapGestureRecognizer
附加到视图,但我无法从内部调用点击手势 action
我的框架。我有:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let foo = Foo()
foo.attachTo(view: view)
}
}
我使用pod lib create Foo
创建了一个框架,里面是
public class Foo {
public init() {}
public func attachTo(view: UIView) {
let endpointGesture = UITapGestureRecognizer(target: self, action: #selector(selected(_:)))
view.backgroundColor = UIColor.blue
view.isUserInteractionEnabled = true
view.addGestureRecognizer(endpointGesture)
}
@objc private func selected(_ sender: UITapGestureRecognizer) {
print("Gesture Recognized")
}
}
我可以看出视图已正确传递到框架中,因为构建应用程序时出现蓝屏。
将手势识别器和 selected
功能移动到 ViewController
中也可以正常工作。点击视图会将 Gesture Recognized
打印到控制台,因此框架发生了一些我不明白的事情。
我已经尝试将 -ObjC
链接器标志添加到框架中,但这似乎没有任何作用。我错过了什么吗?
问题是您的 foo
变量没有保留。
如果您将 foo
变量作为实例变量,它应该可以工作。
class ViewController: UIViewController {
let foo = Foo() // this is now retained by the view controller
override func viewDidLoad() {
super.viewDidLoad()
foo.attachTo(view: view)
}
}
我正在尝试创建我的第一个 Cocoapod 框架,需要将一个简单的 UITapGestureRecognizer
附加到视图,但我无法从内部调用点击手势 action
我的框架。我有:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let foo = Foo()
foo.attachTo(view: view)
}
}
我使用pod lib create Foo
创建了一个框架,里面是
public class Foo {
public init() {}
public func attachTo(view: UIView) {
let endpointGesture = UITapGestureRecognizer(target: self, action: #selector(selected(_:)))
view.backgroundColor = UIColor.blue
view.isUserInteractionEnabled = true
view.addGestureRecognizer(endpointGesture)
}
@objc private func selected(_ sender: UITapGestureRecognizer) {
print("Gesture Recognized")
}
}
我可以看出视图已正确传递到框架中,因为构建应用程序时出现蓝屏。
将手势识别器和 selected
功能移动到 ViewController
中也可以正常工作。点击视图会将 Gesture Recognized
打印到控制台,因此框架发生了一些我不明白的事情。
我已经尝试将 -ObjC
链接器标志添加到框架中,但这似乎没有任何作用。我错过了什么吗?
问题是您的 foo
变量没有保留。
如果您将 foo
变量作为实例变量,它应该可以工作。
class ViewController: UIViewController {
let foo = Foo() // this is now retained by the view controller
override func viewDidLoad() {
super.viewDidLoad()
foo.attachTo(view: view)
}
}