类内的按钮动作选择器
Posted
技术标签:
【中文标题】类内的按钮动作选择器【英文标题】:Button action selector inside class 【发布时间】:2021-11-21 03:22:39 【问题描述】:我最近开始使用 Swift(通常是嵌入式 C 开发人员)进行开发。
我想以编程方式创建一些按钮(以后不止一个)并更改其标签(仅供练习)。
为此,我创建了一个按钮类,其中包含按钮初始化和回调函数。我的问题是#selector
似乎没有像我预期的那样指向按钮类的实例,所以单击按钮什么也不做。你能告诉我我做错了什么吗?
@objc class buttontest : NSObject
let button = NSButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
@objc func printSomething()
print("Hello")
self.button.title="TEST13"
func buttoninit() -> NSButton
self.button.title="Test"
self.button.bezelStyle=NSButton.BezelStyle.rounded
self.button.target=self;
//button.action = Selector(ViewController.printSomething)
self.button.action = #selector(self.printSomething)
return self.button
class ViewController: NSViewController
private lazy var redBox = NSView(frame: NSRect(x: 0, y: 0, width: 100, height: 100))
override func viewDidLoad()
super.viewDidLoad()
view.addSubview(redBox)
redBox.wantsLayer = true
redBox.layer?.backgroundColor = NSColor.red.cgColor
//button.init("Test12",self,Selector(printSomething())
let button = buttontest()
self.view.addSubview(button.buttoninit())
//self.view.addSubview(buttontest().buttoninit())
// Do any additional setup after loading the view.
override func loadView()
self.view = NSView(frame: NSRect(x: 0, y: 0, width: NSScreen.main?.frame.width ?? 100, height: NSScreen.main?.frame.height ?? 100))
override var representedObject: Any?
didSet
// Update the view, if already loaded.
【问题讨论】:
viewDidLoad
中的button
在超出范围并且不再响应printSomething
时被释放。
【参考方案1】:
OK 版本:
@objc class buttontest : NSObject
let button = NSButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
@objc func printSomething()
print("Hello")
self.button.title="TEST13"
func buttoninit() -> NSButton
self.button.title="Test"
self.button.bezelStyle=NSButton.BezelStyle.rounded
self.button.target=buttonX
self.button.action = #selector(buttontest.printSomething)
return self.button
let buttonX = buttontest()
class ViewController: NSViewController
private lazy var redBox = NSView(frame: NSRect(x: 0, y: 0, width: 100, height: 100))
override func viewDidLoad()
super.viewDidLoad()
view.addSubview(redBox)
redBox.wantsLayer = true
redBox.layer?.backgroundColor = NSColor.red.cgColor
self.view.addSubview(buttonX.buttoninit())
【讨论】:
以上是关于类内的按钮动作选择器的主要内容,如果未能解决你的问题,请参考以下文章