类内的按钮动作选择器

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


【讨论】:

以上是关于类内的按钮动作选择器的主要内容,如果未能解决你的问题,请参考以下文章

使用装饰器的类内的函数包装器

将装饰器定义为类内的方法

如何使用装饰器将类的方法添加到类内的列表中

在 Swift/Objective-c 中按媒体类型自定义图像选择器

日历内的角垫日期选择器格式

按钮 [name=] 上带有 Google 跟踪代码管理器的 CSS 选择器