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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UIButton不在其他类的函数中执行操作相关的知识,希望对你有一定的参考价值。

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

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(_:)))

以上是关于UIButton不在其他类的函数中执行操作的主要内容,如果未能解决你的问题,请参考以下文章

9.13面经

UIVIew 中的 UIButton 不在 iPhone 应用程序中居中

我必须使用协议/委托来让 ViewController 执行在另一个类中创建的 UIButton 的操作吗?

使用不同对象时未执行 UIButton 目标操作

UIButton 在子视图控制器中不起作用

多个uibutton在目标c中执行相同的功能