'self'指的是方法'EquationController.self',这可能是意想不到的

'self' refers to the method 'EquationController.self', which may be unexpected

我尝试使用 lazy var 但它没有用,所以我需要解决这个问题,因为“添加图表”按钮不起作用:

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

在您提出的上下文中,self 指的是 EquationController 类型本身,而不是作为 EquationController 实例的对象,这正是您想要的。

即,self.performSelector(#selector(addGraph)) 最终会调用 class func addGraph 而不是 您的实例方法 func addGraph.

要解决此问题,请创建变量 lazy,这会将按钮的实例化延迟到您首次使用它的位置,此时 self 的初始化已完成。您不能在 closure-initialized 存储的 属性 中引用实例的 self,除非您将其设为 lazy。例如:

lazy var addGraphButton: NSButton = {
    let button = NSButton(title: "Add Graph", target: self, action: #selector(addGraph))
    button.translatesAutoresizingMaskIntoConstraints = false
    return button
}()

你说:

i tried to use lazy var but it didn’t work

这是正确的解决方案。您没有共享 addGraph 实现,但请确保添加 @objc 限定符。例如,您通常会定义采用一个参数的操作:

@objc func addGraph(_ sender: Any) { ... }

然后:

lazy var addGraphButton: NSButton = {
    let button = NSButton(title: "Add Graph", target: self, action: #selector(addGraph(_:)))
    button.translatesAutoresizingMaskIntoConstraints = false
    return button
}()