NSButton setAction选择器

时间:2012-12-31 17:04:58

标签: 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函数中添加一个参数...
怎么样?
感谢。

4 个答案:

答案 0 :(得分:5)

  

但是我想在函数myAction ...中添加一个参数   怎么样 ?

你不能。

  

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

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

  • 为每个按钮(或其他控件)分配标记,并比较操作方法中的标记。当您在笔尖中创建控件时,这有一个缺点,您必须将标记写两次(一次在代码中,一次在笔尖中)。由于您是从头开始手工编写按钮,因此没有这个问题。
  • 为您希望向此发送此邮件的每个控件提供一个插座,并将sender与每个插座进行比较。
  • 使用不同的操作方法,每个控件是唯一连接到每个操作的控件。然后,每个操作方法都不需要确定哪个控件向您发送了该消息,因为您已经知道它是采用哪种方法。

标签的问题是前面提到的重复性。也很容易忽略为每个标签命名,所以你最终会看到像if ([sender tag] == 42)这样的代码而不知道/不得不查找哪个控件是#42。

网点的问题在于你的动作方法可能会变得很长,而且无论如何可能会做同样方法中没有业务的多个不同的事情。 (这也是标签的问题。)

所以,我通常更喜欢第三种解决方案。为将您作为目标的每个按钮(或其他控件)创建一个操作方法。您通常会将方法和按钮命名为相同(例如save:和“保存”)或类似的内容(如terminate:和“退出”),因此您只需阅读每个按钮所属的方法。

答案 1 :(得分:1)

我从未以编程方式创建NSButton,但我认为您只需要创建一个这样的方法:

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

就是这样!!

答案 2 :(得分:1)

答案 3 :(得分:0)

    如果您的对象具有任何整数的uniqueID,则
  • .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)
}