0

他们到处都说 IBAction 是什么,但没有解释整个声明的含义。

什么是发件人和ID?

问候, 纳姆拉塔

4

4 回答 4

5
  1. 据我所知IBAction,只是暗示void

  2. id是一个通用的 C 类型,它接受任何种类/类的对象。它有点类似于voidC中的指针。我们可以将id其用作方法的参数,以防不同类的对象访问该方法。

  3. 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:了方法。

当用户触摸aLabelor内部时aTextField,它们text将分别变为Hello UILabelor Hello UITextField

另一种方式: 我们也可以像下面这样调用from的changeGreeting:方法。objOfClassAClass B

[objOfClassA changeGreeting:aLabel];
[objOfClassA changeGreeting:aTextField];

由于上面的代码是不言自明的,objOfClassA接收者。但是aLabel&aTextField不是发件人。因为他们没有调用该方法。在这里,它们只是论据。这里实际的发送者是Class B,但是aLabelaTextField是在参数中传递的(id)sender。无论哪种方式,方法执行的结果都是相同的。

于 2011-01-27T07:05:47.207 回答
2

也许您应该查看一个 Objective-C 教程(例如这个),因为这是非常基础的。

IBAction 被定义为“void”,因此这意味着该方法没有返回值。它仅对 Interface Builder 有用,因此它知道您的哪些方法实际上是您可以链接的操作。

(id)sender 部分是您的方法的(唯一)参数,名为 sender。(id) 表示参数的类型可以是任何对象:

来自Objective-C 常见问题解答

什么是身份证?
它是 Objective-C 用于任意对象的通用 C 类型。[...]

于 2011-01-27T06:47:49.950 回答
1

IBAction是 Interface Builder 在您的源代码中查找的关键字 ( #define'd to void),如果它找到它作为返回类型,它会将其添加到您可以将 IB 元素连接到的可能操作列表中。

id是 Objective-C 中的通用对象类型,表示任何Objective-C 对象。

并且sender只是id-typed 参数的名称。

于 2011-01-27T06:47:34.987 回答
1

从功能上讲:IBAction 是一个关键字,用于标识您可以通过 Interface Builder 链接到的方法。(id)Sender 必须识别对象正在触发该方法,以防您对多个控件使用相同的方法。

于 2011-01-27T07:06:17.687 回答