他们到处都说 IBAction 是什么,但没有解释整个声明的含义。
什么是发件人和ID?
问候, 纳姆拉塔
据我所知IBAction
,只是暗示void
id
是一个通用的 C 类型,它接受任何种类/类的对象。它有点类似于voidC
中的指针。我们可以将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];
在 LINE 1 中,aLabel
是发送者,objOfClassA
也是接收者。在 LINE 2:aTextField
是发送objOfClassA
者和接收者。这里aLabel
&aTextField
被称为发件人,因为他们正在调用方法changeGreeting:
。objOfClassA
之所以称为接收者,是因为这里调用objOfClassA's
changeGreeting:
了方法。
当用户触摸aLabel
or内部时aTextField
,它们text
将分别变为Hello UILabel
or Hello UITextField
。
另一种方式:
我们也可以像下面这样调用from的changeGreeting:
方法。objOfClassA
Class B
[objOfClassA changeGreeting:aLabel];
[objOfClassA changeGreeting:aTextField];
由于上面的代码是不言自明的,objOfClassA
是接收者。但是aLabel
&aTextField
不是发件人。因为他们没有调用该方法。在这里,它们只是论据。这里实际的发送者是Class B
,但是aLabel
和aTextField
是在参数中传递的(id)sender
。无论哪种方式,方法执行的结果都是相同的。
也许您应该查看一个 Objective-C 教程(例如这个),因为这是非常基础的。
IBAction 被定义为“void”,因此这意味着该方法没有返回值。它仅对 Interface Builder 有用,因此它知道您的哪些方法实际上是您可以链接的操作。
(id)sender 部分是您的方法的(唯一)参数,名为 sender。(id) 表示参数的类型可以是任何对象:
什么是身份证?
它是 Objective-C 用于任意对象的通用 C 类型。[...]
IBAction
是 Interface Builder 在您的源代码中查找的关键字 ( #define
'd to void
),如果它找到它作为返回类型,它会将其添加到您可以将 IB 元素连接到的可能操作列表中。
id
是 Objective-C 中的通用对象类型,表示任何Objective-C 对象。
并且sender
只是id
-typed 参数的名称。
从功能上讲:IBAction 是一个关键字,用于标识您可以通过 Interface Builder 链接到的方法。(id)Sender 必须识别对象正在触发该方法,以防您对多个控件使用相同的方法。