【问题标题】:NSButtion action not called when target is different object当目标是不同的对象时不调用 NSButton 动作
【发布时间】:2016-08-03 19:30:43
【问题描述】:

我在视图控制器中有一个 NSButton,当单击它时,它应该调用另一个类的实例中的方法(我在视图控制器中有该实例)。但是,永远不会调用 action 方法。

我的代码如下(简短而简单)。请问有人能解释这是为什么吗?

使用按钮查看控制器类:

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let b:NSButton = NSButton(frame: NSRect(x: 150, y: 200, width: 30, height: 30))
        self.view.addSubview(b)

        let g = Global()

        b.target = g
        b.action = #selector(g.s)
    }
}

我创建了一个名为“全局”的类,然后按钮应在其中调用一个方法:

class Global:NSObject {

    override init() {
        super.init()
    }

    @objc dynamic func s() {
        Swift.print("S ran")
    }
}

谢谢

更新:为了便于复制,我创建了一个 GitHub 存储库,以最简单的形式显示问题 here

【问题讨论】:

    标签: swift macos selector nsbutton


    【解决方案1】:

    问题在于,当您单击按钮时,target 已设置为 nil。这是因为g作为局部变量存储,target是一个弱属性,所以viewDidLoad完成后,g被释放,target变成nil。因此,当您单击按钮时,没有对象可以调用该操作。

    您需要在某处存储对目标的强引用。一种方法是将其作为实例变量存储在您的视图控制器上:

    class ViewController: NSViewController {
        let g = Global()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let b:NSButton = NSButton(frame: NSRect(x: 150, y: 200, width: 30, height: 30))
            self.view.addSubview(b)
    
            b.target = g
            b.action = #selector(g.s)
        }
    }
    

    【讨论】:

    • 啊该死的。谢谢戴顿!我通常构建我的 iOS 应用程序,因此不会发生这种情况,但使用 Mac SDK 和它的微小差异导致我的架构截然不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2016-07-18
    • 2017-04-17
    • 2015-01-16
    • 1970-01-01
    相关资源
    最近更新 更多