2011-01-27 61 views

回答

5
  1. 据我所知IBAction只是意味着void

  2. id是一个通用的C型,它接受任何形式/类的对象。这是一些类似于无效指针C。如果不同种类的对象访问该方法,我们可以使用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]; 

在第1行aLabel发件人objOfClassA接收机。并且在LINE 2中:aTextField发件人objOfClassA收件人。这里aLabel & aTextField被称为发件人,因为他们是调用方法changeGreeting:。并且objOfClassA被称为接收器因为objOfClassA'schangeGreeting:方法是这里叫这里。

当用户在aLabelaTextField内部接触,它们的text将被分别变为Hello UILabelHello UITextField

的其他方式: 我们也可以称之为从Class B像下面的objOfClassAchangeGreeting:方法。

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

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

1

IBAction是一个关键字(#define倒是给void)界面生成器会在您的源代码,如果它发现它的返回类型,将其添加到列表您可以将您的IB元素连接到可能的行为。

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

sender只是id-type参数的名称。

+0

IBAction不是voidde的一个typedef,但实际上是一个被定义为void的宏。您将无法创建诸如“IBAction * something”之类的变量。 (这当然不会有任何意义)。 – fresskoma 2011-01-27 06:53:09

+0

@ x3ro哇,谢谢。 – 2011-01-27 06:57:45

2

也许你应该看看一个Objective-C教程(such as this),因为这是非常基本的。

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

(id)sender部分是您的方法的唯一参数,它被命名为sender。 (ID)说,该参数的类型可以是任何对象:

Objective-C FAQ

是什么ID?
这是Objective-C用于任意对象的通用C类型。 [...]

1

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