IBAction
只是 Interface Builder 的一个标签,它能够定位您打算连接到 UI 元素操作的操作。事实上,它是 的同义词void
:
#define IBAction 无效
除此之外,您还有 2 个不同的方法签名。一个接受争论,一个不接受。在接受参数的方法中,sender
将是一个指向触发该操作的 UI 元素的指针——您将其定义为IBOutlet
最有可能的。
如果您有一个方法将作为 UI 交互(例如触摸)的结果而被调用,那么方法签名需要允许 sender 参数。
在触发动作的对象不一定包含在方法调用中的某些情况下,无参数方法签名很有用。但是你必须保持一致;如果该方法需要一个参数,那么您必须确保 SDK 知道要发送一个参数。这可以像在选择器名称中包含或排除冒号 (:) 一样简单。手势识别器就是一个很好的例子。您可以为手势识别器定义一个动作,如下所示:
-(void)handleTap
{
...
}
然后设置手势识别器以使用此方法:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap)];
请注意@selector(handleTap)
. 另一方面,如果你定义了这样的方法:
-(void)handleTap:(UITapGestureRegognizer *)tap
{
...
}
您必须像这样创建手势识别器:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
看到不同?这样一来,当手势识别器调用您的方法时,它会将自己作为参数传递给您的方法。
老实说,我不确定这种细微差别是否适用于您可以指定选择器的所有地方。我认为这是特定于上下文的。例如,NSTimer 的选择器必须能够在其参数中接受指向 NSTimer 对象的指针。文档通常会根据具体情况明确说明这一点。