'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
}()
我尝试使用 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
}()