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
作为一个实例变量,它起了作用。非常感谢。我脑子里想的是,它将在应用程序的生命周期中一直保存在内存中(现在我想这是相当愚蠢的)。如果您愿意继续添加您的评论作为回答,我很乐意接受。非常感谢。非常有用。