他们在哪里说IBAction是什么,但不解释整个宣言的含义。
什么是发件人和身份证?
此致 Namratha
答案 0 :(得分:5)
根据我的知识IBAction
,只是暗示void
id
是一种通用的C类型,它接受任何类型/类的对象。它与C
中的 void指针类似。我们可以使用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
是收件人。在第2行中:aTextField
是发件人,objOfClassA
是收件人。这里aLabel
& aTextField
被称为发件人,因为他们调用方法changeGreeting:
。 objOfClassA
被称为接收器,因为此处objOfClassA's
changeGreeting:
方法称为。
当用户触及aLabel
或aTextField
时,他们的text
将分别更改为Hello UILabel
或Hello UITextField
。
另一种方式:
我们也可以从changeGreeting:
调用objOfClassA
Class B
方法,如下所示。
[objOfClassA changeGreeting:aLabel];
[objOfClassA changeGreeting:aTextField];
由于上述代码不言自明,objOfClassA
是接收器。但是aLabel
& aTextField
不是发件人。因为他们没有调用该方法。在这里,他们只是争论。实际发件人为Class B
,但aLabel
和aTextField
在参数(id)sender
中传递。无论哪种方式,方法执行的结果都是相同的。
答案 1 :(得分:2)
也许您应该查看Objective-C教程(such as this),因为这是非常基础的。
IBAction被定义为“void”,因此它意味着该方法没有返回值。它仅对Interface Builder有用,因此它知道您的哪些方法实际上是您可以链接的操作。
(id)发件人部分是您方法的唯一参数,名为sender。 (id)表示参数的类型可以是任何对象:
什么是id?
它是Objective-C用于任意对象的通用C类型。 [...]
答案 2 :(得分:1)
IBAction
是Interface Builder在源代码中查找的关键字(#define
'到void
),如果它将其作为返回类型找到,则会添加它在可能的行为列表中,您可以将IB元素连接到。
id
是Objective-C中的通用对象类型,表示任何 Objective-C对象。
和sender
只是id
- 类型参数的名称。
答案 3 :(得分:1)
功能上说:IBAction是一个关键字,用于标识可以通过Interface Builder链接到的方法。 (id)如果对多个控件使用相同的方法,发件人必须识别对象是否触发该方法。