0

我已经观察到几次点击 UIButton 和调用

  -(IBAction) action:(id)sender     Method1
  {
    do something....
   }

与以编程方式调用它 Method2

  -(void) action
   {
    do something....
   }

当动作被这样调用时,方法 1 是正确的。Method2显示了不同的错误效果。

在这两个例程中,做某事是完全相同的。

为什么会有这样的差异?以及我可以做些什么来以编程方式模仿 IBAction?

4

1 回答 1

2

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 对象的指针。文档通常会根据具体情况明确说明这一点。

于 2012-08-21T19:31:28.687 回答