UIButton 不从不同类中的函数执行操作



>我有一个类,其中编写的是一个创建我的按钮的函数:

登录按钮.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(_:)))

最新更新