Swift MacOS 按钮数组调用带参数的函数

Swift MacOS array of buttons call function with argument

我有一个类似于国际象棋的棋盘游戏,有 60 个区域。我不想在故事板中手动连接它们,而是想用 for...in 来完成。 我的代码是这样的:

let feld = NSButton()
feld.frame = CGRect(x: 1300+30*h, y: 20, width: 22, height: 22)
feld.target = self
feld.action = #selector(ButtonTest)
self.view.addSubview(feld)
ButtonArray.append(feld)

还有这样的函数(我不明白为什么我在函数之前需要 @objc 但只有这样它才能工作。

@objc func ButtonTest() {
ButtonArray[2].isEnabled=false
}

代码运行良好。但是我想将一个参数传递给该函数,这样我就可以停用刚刚按下的按钮,而不仅仅是像本例中那样的 [2]。 (我想向这个函数添加其他计算)。

我找了一圈,好像不能传参。如果那是真的,我还能如何解决我的问题?

编辑: 很好的答案和解释,谢谢。我遗憾地不准确地问了这个问题:我不仅想停用按下的按钮,而且 像这样计算:

var score = 5+/NumberOfButtonPressed/

因此,如果按下第一个按钮,var score=6,如果按下第 10 个按钮,score=15。

您需要 @objc,否则 Swift 编译器将不会为该方法创建选择器。选择器是一个Objective-C值,标识一个方法,需要通过Objective-C调用方法。 (Cocoa 写在 Objective-C 中。)您可以使用 #selector 获取方法的选择器,正如您已经找到的那样。

在 macOS 上,通过 Cocoa 调用的操作采用 0 或 1 个附加参数。可选参数是 "sender",它是触发操作的对象(您单击的按钮)。试试这个:

@objc
func ButtonTest(sender: NSButton?) {
    sender?.isEnabled = false
}

您不需要更改 #selector() 表达式。 Cocoa 运行时将凭借该参数调用您的方法。