我只想添加带有setAction参数的NSButton。
NSRect frame = NSMakeRect(10, 40, 90, 40);
NSButton* pushButton = [[NSButton alloc] initWithFrame: frame];
[pushButton setTarget:self];
[pushButton setAction:@selector(myAction:)];
但是我想在myAction函数中添加一个参数...
怎么样?
感谢。
答案 0 :(得分:5)
但是我想在函数myAction ...中添加一个参数 怎么样 ?
你不能。
...如果有多个按钮使用此方法,我们无法区分发件人(仅限标题)......
有三种方法可以判断哪个按钮(或其他控件)正在与您交谈:
sender
与每个插座进行比较。标签的问题是前面提到的重复性。也很容易忽略为每个标签命名,所以你最终会看到像if ([sender tag] == 42)
这样的代码而不知道/不得不查找哪个控件是#42。
网点的问题在于你的动作方法可能会变得很长,而且无论如何可能会做同样方法中没有业务的多个不同的事情。 (这也是标签的问题。)
所以,我通常更喜欢第三种解决方案。为将您作为目标的每个按钮(或其他控件)创建一个操作方法。您通常会将方法和按钮命名为相同(例如save:
和“保存”)或类似的内容(如terminate:
和“退出”),因此您只需阅读每个按钮所属的方法。
答案 1 :(得分:1)
我从未以编程方式创建NSButton,但我认为您只需要创建一个这样的方法:
- (void) myAction: (NSButton*)button{
//your code
}
就是这样!!
答案 2 :(得分:1)
您可以使用关联的对象传递参数。
您可以参考:http://labs.vectorform.com/2011/07/objective-c-associated-objects/
答案 3 :(得分:0)
.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)
}