Ios UIButton从错误的类调用函数

Ios UIButton从错误的类调用函数,ios,swift,uibutton,Ios,Swift,Uibutton,我有一个ButtonProvider类,它创建我的按钮并添加一个目标操作。但是,当按下按钮时,它不会从创建它的ButtonProvider类调用函数,而是从另一个类调用具有相同名称的函数 class ButtonProvider { let view: UIView! let button: UIButton! init(view: UIView) { self.view = view } func showButton() {

我有一个
ButtonProvider
类,它创建我的按钮并添加一个目标操作。但是,当按下按钮时,它不会从创建它的
ButtonProvider
类调用函数,而是从另一个类调用具有相同名称的函数

class ButtonProvider {

    let view: UIView!
    let button: UIButton!

    init(view: UIView) {
        self.view = view
    }

    func showButton() {
        button = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
        button.backgroundColor = .white
        button.addTarget(self, action: #selector(ButtonProvider.close), for: .touchUpInside)

        view.addSubview(button)
    }

    @objc func close() {
        button.removeFromSuperview()
    }

}
在我的呼叫中
ViewController

override func viewDidLoad() {
    let buttonProvider = ButtonProvider(view: self.view)
    buttonProvider.showButton()
}

@objc func close() {
    //This is the function that is called
}

知道ButtonProvider.close的选择器为什么调用my ViewController.close函数吗?

您的
ButtonProvider
不属于控制器,因此它将在
viewDidLoad
结束后立即解除分配。当按下按钮时,实例不再存在于内存中,结果将是未定义的行为,通常是崩溃


您必须将
buttonProvider
保存到控制器中的一个强属性。

那么,
buttonProvider
不会被保留,因此它将被释放。我很惊讶应用程序没有崩溃。为什么使用#选择器(ButtonProvider.close)而不是#选择器(close)?@DmytroShvecov,这是一样的。我很确定视图控制器上不能调用
close
,除非您明确将其添加为目标。@Sulthan您是正确的。我刚刚创建了
buttonProvider
作为一个实例变量,它起了作用。非常感谢。我脑子里想的是,它将在应用程序的生命周期中一直保存在内存中(现在我想这是相当愚蠢的)。如果您愿意继续添加您的评论作为回答,我很乐意接受。非常感谢。非常有用。