i tried to use lazy var but it didn't work, so i need to solve this cz the "Add Graph" button is not working:
var addGraphButton: NSButton = {
let button = NSButton(title: "Add Graph", target: self, action: #selector (addGraph))
button.translatesAutoresizingMaskIntoConstraints = false
return button // 'self' refers to the method 'EquationController.self', which may be unexpected
}()

CodePudding user response:
In the context you posed, self refers to the EquationController type itself, not an object which is an instance of EquationController, which is what you intended.
I.e., self.performSelector(#selector(addGraph)) would end up calling class func addGraph, not your instance method func addGraph.
To fix this, make the variable lazy, which will defer the instantiation of the button to where you first use it, at which point the initialization of self is complete. You cannot reference self of the instance in a closure-initialized stored property unless you make it lazy. E.g.:
lazy var addGraphButton: NSButton = {
let button = NSButton(title: "Add Graph", target: self, action: #selector(addGraph))
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()
You said:
i tried to use lazy var but it didn’t work
This is the correct solution. You did not share your addGraph implementation, but make sure you add @objc qualifier. E.g., you would generally define the action to take one parameter:
@objc func addGraph(_ sender: Any) { ... }
And then:
lazy var addGraphButton: NSButton = {
let button = NSButton(title: "Add Graph", target: self, action: #selector(addGraph(_:)))
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()
