首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSButton setAction选择器

NSButton setAction选择器
EN

Stack Overflow用户
提问于 2013-01-01 01:04:58
回答 4查看 6.6K关注 0票数 4

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

代码语言:javascript
复制
NSRect frame = NSMakeRect(10, 40, 90, 40);  
NSButton* pushButton = [[NSButton alloc] initWithFrame: frame];  
[pushButton setTarget:self];   
[pushButton setAction:@selector(myAction:)];

但是我想给函数myAction加上一个参数...

怎么做到的?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-01 04:27:45

但是我想给myAction函数加上一个参数。

怎么做到的?

你不能这么做。

…如果有多个按钮使用这种方法,我们不能区分发送者(只有标题)……

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

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

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

outlets的问题是,您的操作方法可能会变得非常长,而且无论如何都可能在同一个方法中做多个不同的事情,而这些事情是没有意义的。(这也是标签的问题。)

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

票数 5
EN

Stack Overflow用户

发布于 2013-01-01 01:30:38

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

代码语言:javascript
复制
- (void) myAction: (NSButton*)button{
    //your code
}

就是这样!!

票数 1
EN

Stack Overflow用户

发布于 2013-01-01 02:23:18

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14104191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档