从代码中调用IBAction的最佳方法是什么?

iwa*_*bed 29 iphone cocoa-touch interface-builder ibaction ios

比方说,我有一个IBAction,它连接到界面构建器中的UIButton.

- (IBAction)functionToBeCalled:(id)sender
{
   // do something here   

}
Run Code Online (Sandbox Code Playgroud)

在我的代码中,例如在另一种方法中说,调用IBAction的最佳方法是什么?

如果我试着像这样调用它,我收到一个错误:

[self functionToBeCalled:];
Run Code Online (Sandbox Code Playgroud)

但是,如果我试着像这样打电话(我觉得有点作弊),它运作正常:

[self functionToBeCalled:0];
Run Code Online (Sandbox Code Playgroud)

正确调用它的正确方法是什么?

Jak*_*org 68

正确的方法是:

- [self functionToBeCalled:nil] 
Run Code Online (Sandbox Code Playgroud)

传递一个nil发送者,表明它没有通过通常的框架调用.

要么

- [self functionToBeCalled:self]
Run Code Online (Sandbox Code Playgroud)

传递给自己作为发件人,这也是正确的.

选择哪一个取决于函数的确切功能以及发件人的期望.


Cri*_*tik 11

从语义上讲,调用IBAction应该仅由UI事件触发(例如按钮点击).如果需要从多个位置运行相同的代码,则可以将该代码从IBAction专用方法中提取出来,并从两个位置调用该方法:

- (IBAction)onButtonTap:(id)sender {
    [self doSomething];
}
Run Code Online (Sandbox Code Playgroud)

这允许您根据发送方执行额外的逻辑(可能您可能会将相同的操作分配给多个按钮,并根据sender参数决定要执行的操作).并且还减少了您需要编写的代码量IBAction(这使您的控制器实现保持干净).