Cocoa NSButton设置动作选择器

Cocoa NSButton设置动作选择器,cocoa,nsbutton,Cocoa,Nsbutton,我只想添加一个带有setAction参数的NSButton NSRect frame = NSMakeRect(10, 40, 90, 40); NSButton* pushButton = [[NSButton alloc] initWithFrame: frame]; [pushButton setTarget:self]; [pushButton setAction:@selector(myAction:)]; 但是我想给函数myAction加一个参数。。。 怎么做? 谢谢

我只想添加一个带有setAction参数的NSButton

NSRect frame = NSMakeRect(10, 40, 90, 40);  
NSButton* pushButton = [[NSButton alloc] initWithFrame: frame];  
[pushButton setTarget:self];   
[pushButton setAction:@selector(myAction:)];
但是我想给函数myAction加一个参数。。。
怎么做?

谢谢。

我从未以编程方式创建过NSButton,但我认为您只需要创建一个如下方法:

- (void) myAction: (NSButton*)button{
    //your code
}

就这样

可以使用关联对象传递参数

你可以参考:

但是我想给函数myAction加一个参数…
怎么做

你不能

…如果有多个按钮使用此方法,我们无法区分发件人(仅使用标题)

有三种方法可以判断哪个按钮(或其他控件)正在与您通话:

  • 为每个按钮(或其他控件)分配一个标记,并在操作方法中比较标记。当您在nib中创建控件时,其缺点是您必须编写两次标记(一次在代码中,一次在nib中)。因为你是用手从头开始写按钮,所以你没有这个问题
  • 为您希望向您发送此消息的每个控件设置一个出口,并将
    发送者
    与每个出口进行比较
  • 具有不同的操作方法,每个控件是连接到每个操作的唯一控件。然后,每个操作方法不需要确定哪个控件向您发送了该消息,因为您已经知道它是通过哪个方法发送的
标签的问题在于前面提到的重复性。也很容易忽略命名每个标记,因此您最终会查看类似于
if([sender tag]==42)
的代码,而不知道/不必查找哪个控件是#42

outlets的问题是,你的动作方法可能会变得很长,而且不管怎么说,可能是在做多个不同的事情,而这些事情与使用同一种方法无关。(这也是标记的一个问题。)

因此,我通常倾向于第三种解决方案。为每个以您为目标的按钮(或其他控件)创建一个操作方法。您通常会将方法和按钮命名为相同的名称(如
save:
和“save”)或非常类似的名称(如
terminate:
和“Quit”),这样您只需阅读每个方法所属的按钮就可以知道了。

  • 如果对象具有任何整数唯一ID,
    .tag
    就足够了
  • 我改用
    .identifier
    ,因为它支持基于字符串的uniqueID
例如:

...
for (index, app) in apps.enumerated() {
    let appButton = NSButton(title: app.title, target: self, action: #selector(appButtonPressed))
    appButton.identifier = NSUserInterfaceItemIdentifier(rawValue: app.guid)
}

...
@objc func appButtonPressed(sender: NSButton) {
    print(sender.identifier?.rawValue)
}

不要忘记设置目标
[按钮设置目标:self]@Joe谢谢,我忘了!是的,但是如果有多个按钮使用此方法,我们无法区分发件人(仅使用标题)…您可以通过做一些事情来区分。1) 你可以使用不同的方法(它们不必全部转到
myAction
,或者您可以将
NSButton*按钮
添加到
*.h
文件中,并在
myAction
中检查什么是NSButton
按钮。我不能使用不同的方法,因为有一个通过编程创建的多个NSWindow,然后在每个NSWindow中,一个NSButton必须有一个di。)不同的行为…@Simon V.当然可以。你只需要写一个if语句,其中你说如果发送者等于一个按钮。它总是一个按钮…;-(我无法区分它们。