Cocoa NSButton设置动作选择器
我只想添加一个带有setAction参数的NSButtonCocoa 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加一个参数。。。 怎么做? 谢谢
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
- 我改用
,因为它支持基于字符串的uniqueID.identifier
...
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语句,其中你说如果发送者等于一个按钮。它总是一个按钮…;-(我无法区分它们。