4

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

NSRect frame = NSMakeRect(10, 40, 90, 40);  
NSButton* pushButton = [[NSButton alloc] initWithFrame: frame];  
[pushButton setTarget:self];   
[pushButton setAction:@selector(myAction:)];

但我想为函数 myAction 提供一个参数...
如何?
谢谢。

4

4 回答 4

5

但我想为函数 myAction 提供一个参数...
如何?

你不能。

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

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

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

标签的问题是前面提到的重复性。忽略命名每个标签也很容易,因此您最终会查看类似代码if ([sender tag] == 42)并且不知道/必须查找哪个控件是#42。

出口的问题是您的操作方法可能会变得很长,并且无论如何可能正在做多种不同的事情,而这些事情在同一方法中没有任何业务。(这也是标签的问题。)

所以,我通常更喜欢第三种解决方案。为将您作为其目标的每个按钮(或其他控件)创建一个操作方法。您通常会将方法和按钮命名为相同的名称(likesave:和“Save”)或非常相似的名称(liketerminate:和“Quit”),因此您只需阅读每个方法即可知道它属于哪个按钮。

于 2012-12-31T20:27:45.370 回答
1

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

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

就是这样!

于 2012-12-31T17:30:38.107 回答
1

您可以使用关联的对象来传递参数。

您可以参考: http: //labs.vectorform.com/2011/07/objective-c-associated-objects/

http://www.cocoanetics.com/2012/06/associated-objects/

于 2012-12-31T18:23:17.863 回答
1
  • .tag如果您的对象有任何整数 uniqueID 就足够了。
  • 我改用.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)
}
于 2018-09-28T04:47:54.370 回答