Obj-C IBAction(id)发送者

时间:2014-05-28 08:19:12

标签: objective-c cocoa variables ibaction

我有IBAction喜欢:

- (IBAction)thisThing:(id)sender {

  [self doSomething];
}

我想这样做(手动调用IBAction):

[self thisThing];

但是我显然需要做[self thisThing:...];。 < - (结肠后怎么回事?)

我不确定(id)sender应该是什么。如何手动调用它而无需单击它所绑定的按钮? I searched for anything about IBAction (id)sender结果显得空洞。

5 个答案:

答案 0 :(得分:1)

  

结肠后发生了什么事?

这取决于你在IBAction中编写代码的方式。比如一个计算器应用程序,如果所有按钮都连接了相同的IBAction,那么您需要发件人(在这种情况下为NSButton)来识别触摸/点击的按钮。

-(IBAction) buttonClicked:(id) sender {
    // sender's identifier or Tag will let us know the number clicked here
    [self doSomeThing];
}

但是,如果每个按钮都有IBActions,则不需要依赖发件人。

-(IBAction) firstButtonClicked:(id)sender;
-(IBAction) secondButtonClicked:(id)sender;

依旧......

因此,在第一种情况下,如果我想以编程方式调用该操作,我会通过设置适当的属性来传递发件人,以确保点击了正确的按钮。在第二种情况下,只需通过nil,因为它不依赖于发件人的价值。

答案 1 :(得分:0)

如果你有按钮的IBOutlet,你可以像[self thisThing:btn];

那样传递它

或者简单地传递nil,[self thisThing:nil];(如果你没有在IBAction中使用发件人)

答案 2 :(得分:0)

虽然popeye的评论回答了你的问题,但还有另一个观点。

您可以完全控制操作方法。如果您没有对该方法中的任何内容使用sender参数,那么在手动调用时不必提供它。通过不提供它我的意思是传递nil作为参数的值。

通常,它将包含指向连接到操作的控件的指针。如果您确实想要使用if,那么您只需将sender转换为控件的类型并对其执行任何操作。

答案 3 :(得分:0)

- (IBAction)thisThing:(id)sender

在这里,

-表示实例方法的开头,而+表示类(静态)方法。

( .. )表示返回类型。 IBAction实际上是void。使用IBAction代替void表示此方法将与UI(.nib)事件相关联。

thisThing是方法的名称,后跟参数列表。

在C视点中,实际的函数名称类似于thisThing:。也就是说,参数个数修改了函数名称(外部链接)。

如果您打算拨打thisThing:但是写[self thisThing],则表示您正在调用不同的(不存在)方法。

所以,你必须写:。通过什么实际价值?可以通过查看方法实现来决定这一点。

答案 4 :(得分:0)

- (IBAction)thisThing:(id)sender {
}

事件处理程序。这意味着当某人发送事件时会调用它。一个典型的事件示例是单击按钮,在这种情况下,按钮发送事件(这意味着按钮,NSButton实例,是发送者)。

将发件人作为参数对于来自不同来源的事件使用相同的事件处理程序非常有用,例如:

- (IBAction)buttonTapped:(id)sender {
    if (sender == self.myButton1) {
       //button 1 was tapped
    }
    else if (sender == self.myButton2) {
       //button 2 was tapped
    }
}

如果是这种情况,如果您想手动调用事件处理程序,只需调用

即可
[self buttonTapped:self.myButton1];

如果您不使用sender参数,则只需拨打

即可
[self buttonTapped:nil];

但是,该参数是完全可选的,因此您可以将其消除:

- (IBAction)buttonTapped {
    // ...
}

[self buttonTapped];

另外,单独调用事件处理程序永远不会好。事件处理程序用于处理事件。如果需要手动执行相同的操作,请将其与事件处理程序分开,例如

- (IBAction)buttonTapped {
    [self doSomething];
}

而不是致电[self buttonTapped],请致电[self doSomething]