UIButton不在其他类的函数中执行操作

问题描述 投票:2回答:3

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

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没有打印出任何类型的错误或警告消息。

ios swift uibutton
3个回答
0
投票

你缺少目标。因此,在全局范围内即时创建目标,并将其用作按钮操作处理程序的目标。

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")
    }
}

3
投票

在目标对象中调用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)

    }()
}

-2
投票

只需将Selector作为函数参数传递。

func createButtonWith(selector: Selector) {


    let myButton: UIButton = {
        let button = UIButton()
        button.addTarget(self, action: selector), for: .touchUpInside)

    }()

}

并调用此函数如下...

createButtonWith(selector: #selector(Foo().buttonPressed(_:)))
© www.soinside.com 2019 - 2024. All rights reserved.