>我有一个类,其中编写的是一个创建我的按钮的函数:
登录按钮.swift
func createButton() {
let myButton: UIButton = {
let button = UIButton()
button.addTarget(self, action: #selector(Foo().buttonPressed(_:)), for: .touchUpInside)
}()
}
现在在我的第二堂课Foo.swift,我有一个只打印语句的函数。
傅.swift
@objc func buttonPressed(_ sender: UIButton) {
print("button was pressed")
}
运行时,除了尝试按下按钮外,我没有收到任何错误,没有任何反应。什么都没有打印,UIButton
没有任何反应。真的不确定错误发生在哪里,因为Xcode没有打印出任何类型的错误或警告消息。
在目标对象中调用操作方法。因此,您必须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)
}()
}
你缺少目标。因此,全局即时定位并将其用作按钮操作处理程序的目标。
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)
}
}
福类:
class Foo {
@objc func buttonPressed(_ sender: UIButton) {
print("button was pressed")
}
}
只需将Selector
作为函数参数传递即可。
func createButtonWith(selector: Selector) {
let myButton: UIButton = {
let button = UIButton()
button.addTarget(self, action: selector), for: .touchUpInside)
}()
}
并像下面这样调用此函数...
createButtonWith(selector: #selector(Foo().buttonPressed(_:)))