2011-04-07 60 views
33

在一些IBAction我看到:目的C:什么是“(id)发送者”?

- (IBAction)pushButton:(id)sender; 

(id)sender我什么时候使用它?

+3

注意:您可以[格式线为代码(http://meta.stackexchange.com/questions/22186/how-do-i- format-my-code-blocks),通过缩进它们四个空格,相比之下,前导'-'会给你一个list元素,就像你在que中看到的那样Stion的。编辑器工具栏中的“{}”按钮可以为您做到这一点。编辑你的问题并尝试一下。单击编辑器工具栏中的橙色问号以获取更多信息和格式化提示。 – outis 2011-04-07 08:35:05

回答

33
(id)sender is the object which sent the message to that selector. 

代码示例:

- (IBAction)submitButton:(id)sender { 
    UIButton *button = (UIButton *)sender; 
    [button setEnabled:NO]; 
    [button setTitle:@"foo" forState:UIControlStateDisabled]; 
} 
+0

好的,但你可以使用这个ID发件人只用于“按钮”;如果我应该修改一个文本框,那么这是怎么回事? – CrazyDev 2011-04-07 09:04:25

+0

@blackguardian:你的意思是你想将id转换为UITextField,然后改变它的文本? – 2011-04-07 09:38:13

+0

是............ – CrazyDev 2011-04-07 09:47:26

62

马特加洛韦描述的(id) sender的含义在行动上iPhone开发SDK论坛正是如此:

(ID)发送器是发送消息到该选择器的对象。这就像在你传递给函数的控制委托功能等

你会使用这个,如果你有2个对象,其被调用一个选择,你希望他们之间的区别。当然,你可以使用两种不同的函数,但它通常更简洁,重用代码的次数更少。

查看 UIControl Class Reference了解更多详情。


为一个例子,的UITextField具有当的UITextField编辑结束触发一个委托:

-(IBAction) editingEnded:(id) sender { 
    // the cast goes here, lets assume there's more than one UITextfield 
    // in this Owner and you want to know which one of them has triggered 
    // the "editingEnded" delegate 
    UITextField *textField= (UITextField*)sender; 
    if(textfield == iAmTheLastTextField) 
    { 
    // for example login now. 
    [self login]; 
    } 
} 
+13

这个答案实际上比被接受的答案要好... – 2012-05-13 19:48:57

4

“发送者”是变量的名称。

“(ID)”是指该变量的类型是“ID”,即表示“任何对象”的(你可以看到它的对象层次结构的顶部,如果你想

的名称该方法是按钮:和要求任何种1个参数

此方法将被链接到一个按钮上的UI此UI的代表将接收该呼叫,并且必须具有的UIButton的参考。有时候你不需要它,有时你需要访问那个UIButton来改变他的属性,例如

1

它是Cocoa的target-action mechanism的一部分,它是一种物体可以相互通信的方式。在响应于事件(例如,鼠标点击),一个对象(通常是某种控制)将消息发送给另一个对象。发送方被调用,以及,“发送者”,接收方是“目标”和消息是“动作”。

您可以使用它在目标的消息处理程序,以获取有关发送方的动作的附加信息。

+0

如果有一个例子正是如何获得附加信息,这将更有用:) – 2013-10-19 19:39:07

+0

@GForty:不可能,因为'id'是一个通用对象。一般来说,它是一个NSObject,但类型不再那么确定。如果你需要额外的信息,你必须知道对象实现了什么接口,并向它发送适当的消息(如在gontnull的示例中,发送者被假定为一个按钮)。 – outis 2013-10-20 02:31:37

0

我从Rabskatran教训。但我wouldlike纠正说:“发件人”是变量的名称的唯一部分。它应该是(来自Apple文档 - https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html):

“动作消息调用的方法具有特定的签名:单个参数持有对启动动作消息的对象的引用;按照惯例,此参数的名称是发件人。例如,

  • (void)moveToEndOfLine:(id)sender; //从NSResponder.h”

所以它是一个参数!

相关问题