我有一个类,其中写的是一个创建我的按钮的函数:
LoginButton.swift
func createButton() {
let myButton: UIButton = {
let button = UIButton()
button.addTarget(self, action: #selector(Foo().buttonPressed(_:)), for: .touchUpInside)
}()
}
现在在我的第二个类Foo.swift中,我有一个只打印语句的函数
Foo.swift
@objc func buttonPressed(_ sender: UIButton) {
print("button was pressed")
}
跑步时我没有错误,除非我尝试按下按钮,没有任何反应。什么都没打印,UIButton
没有任何反应。真的不确定错误发生的位置,因为Xcode没有打印出任何类型的错误或警告消息。
你缺少目标。因此,在全局范围内即时创建目标,并将其用作按钮操作处理程序的目标。
class ViewController: UIViewController {
let foo = Foo()
override func viewDidLoad() {
super.viewDidLoad()
createButton()
}
func createButton() {
let myButton: UIButton = {
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 50))
button.backgroundColor = UIColor.red
button.setTitle("Tap me", for: .normal)
button.addTarget(self.foo, action: #selector(self.foo.buttonPressed(_:)), for: .touchUpInside)
return button
}()
myButton.center = self.view.center
self.view.addSubview(myButton)
}
}
Foo类:
class Foo {
@objc func buttonPressed(_ sender: UIButton) {
print("button was pressed")
}
}
在目标对象中调用action方法。因此,您要么将buttonPressed
移动到包含createButton
的类,要么将Foo
的实例作为目标对象传递。
但请注意,按钮不是其目标的所有者。所以,如果你只是写:
button.addTarget(Foo(), action: #selector(buttonPressed(_:)), for: .touchUpInside)
这不起作用,因为Foo
对象会在该行之后立即释放。你必须对Foo()
有强烈的参考(例如属性)
let foo = Foo()
func createButton() {
let myButton: UIButton = {
let button = UIButton()
button.addTarget(foo, action: #selector(buttonPressed(_:)), for: .touchUpInside)
}()
}
只需将Selector
作为函数参数传递。
func createButtonWith(selector: Selector) {
let myButton: UIButton = {
let button = UIButton()
button.addTarget(self, action: selector), for: .touchUpInside)
}()
}
并调用此函数如下...
createButtonWith(selector: #selector(Foo().buttonPressed(_:)))