当目标是不同的对象时,不会调用NSButtion操作

时间:2016-08-03 19:30:43

标签: swift macos selector nsbutton

我在View Controller中有一个NSButton,当点击它时,应该调用另一个类的实例中的方法(我在View Controller中有该实例)。但是,永远不会调用action方法。

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

使用按钮查看Controller类:

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

班级名为' Global'我创建了一个实例,该按钮应该调用一个方法:

class Global:NSObject {

    override init() {
        super.init()
    }

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

由于

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

1 个答案:

答案 0 :(得分:4)

问题是,当您点击该按钮时,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) } } 。因此,当您单击该按钮时,没有可以调用该操作的对象。

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

{
    "type": "message",
    "subtype": "channel_join",
    "ts": "1358877458.000011",
    "user": "U2147483828",
    "text": "<@U2147483828|cal> has joined the channel"
}