无处不在,他们说IBAction是什么,但没有解释整个声明的含义。声明解释 - (IBAction)changeGreeting:(id)sender; iPhone
什么是发件人和ID?
问候, Namratha
无处不在,他们说IBAction是什么,但没有解释整个声明的含义。声明解释 - (IBAction)changeGreeting:(id)sender; iPhone
什么是发件人和ID?
问候, Namratha
据我所知IBAction
只是意味着void
id
是一个通用的C型,它接受任何形式/类的对象。这是一些类似于无效指针在C
。如果不同种类的对象访问该方法,我们可以使用id
作为方法的参数。
sender
,在这里,
changeGreeting:
对象实例:
让我们假设方法changeGreeting:
定义在ClassA
中,它的内容如下所示。
- (IBAction)changeGreeting:(id)sender {
[sender setText:@"Hello %@", [sender class]];
// Nothing can be returned from this method
}
并考虑我们在Class B
有以下几行。
// LINE 1
[aLabel addTarget:objOfClassA action:@selector(changeGreeting:) forControlEvents:UIControlEventTouchUpInside];
// LINE 2
[aTextField addTarget:objOfClassA action:@selector(changeGreeting:) forControlEvents:UIControlEventTouchUpInside];
在第1行aLabel
是发件人和objOfClassA
是接收机。并且在LINE 2中:aTextField
是发件人和objOfClassA
是收件人。这里aLabel
& aTextField
被称为发件人,因为他们是调用方法changeGreeting:
。并且objOfClassA
被称为接收器因为objOfClassA's
changeGreeting:
方法是这里叫这里。
当用户在aLabel
或aTextField
内部接触,它们的text
将被分别变为Hello UILabel
或Hello UITextField
。
的其他方式: 我们也可以称之为从Class B
像下面的objOfClassA
changeGreeting:
方法。
[objOfClassA changeGreeting:aLabel];
[objOfClassA changeGreeting:aTextField];
作为上述代码是自解释的,objOfClassA
是接收机。但aLabel
& aTextField
不是发件人。因为他们没有调用该方法。这里他们只是参数。这里的实际发件人是Class B
,但aLabel
和aTextField
在参数(id)sender
中传递。无论哪种方式,方法执行的结果都是相同的。
IBAction
是一个关键字(#define
倒是给void
)界面生成器会在您的源代码,如果它发现它的返回类型,将其添加到列表您可以将您的IB元素连接到可能的行为。
id
是Objective-C中的通用对象类型,表示任何 Objective-C对象。
和sender
只是id
-type参数的名称。
也许你应该看看一个Objective-C教程(such as this),因为这是非常基本的。
IBAction被定义为“void”,所以它表示该方法没有返回值。它仅适用于Interface Builder,因此它知道您的哪些方法实际上是可以链接的操作。
(id)sender部分是您的方法的唯一参数,它被命名为sender。 (ID)说,该参数的类型可以是任何对象:
是什么ID?
这是Objective-C用于任意对象的通用C类型。 [...]
功能上说:IBAction是一个关键字,用于标识可以通过Interface Builder链接到的方法。 (id)Sender对于在多个控件使用相同方法的情况下识别该对象正在触发该方法。
IBAction不是voidde的一个typedef,但实际上是一个被定义为void的宏。您将无法创建诸如“IBAction * something”之类的变量。 (这当然不会有任何意义)。 – fresskoma 2011-01-27 06:53:09
@ x3ro哇,谢谢。 – 2011-01-27 06:57:45