我什么时候应该使用IBOutlet而不是IBAction?

时间:2012-06-29 00:52:28

标签: objective-c interface-builder

我知道IBAction和IBOutlet之间的区别,但我不知道何时应该使用其中一个。

例如,我正在尝试制作一个计算器。我有十个按钮和一个标签来显示结果。我必须在界面中创建十个IBOutlet吗?如果没有,为什么不呢?

3 个答案:

答案 0 :(得分:4)

IBOutlet是与对象的连接,IBAction是与要作为回调调用的方法的连接。例如,您可能有十个按钮和一个标签,但您可以使用IBOutlet连接到标签(以便更新其值),以及连接到- (IBAction)buttonPressed:(id)sender;的单个函数onTouchUpInside十个按钮中的每个按钮的事件。然后,buttonPressed:方法的实现需要检查sender以确定其值是什么。

如果您需要这样做,则每个按钮不需要IBOutlet

答案 1 :(得分:2)

好的,IBOutlets和IBActions有两个不同的目的。

IBActions基本上是可以通过IB连接到UI元素的方法。它们提供了在UI发生某些事情时通知对象的方法。它们还在调用时提供sender参数,以便您可以访问从方法中发送消息的UI元素。

另一方面,IBOutlet提供了一种在任何时候获取代码中UI元素的引用的方法,当您需要更改UI的各个方面时,可以使用它。

根据您的情况,您不需要为按钮设置IBOutlets,因为您不需要更改任何关于它们的信息,只需要在按下它们时收到通知。

作为一个注释,如果你有那么多按钮,并且你出于某种原因需要一种方法从你的代码中访问它们以改变它们的某些东西我不建议使用10个IBOutlets。相反,我会使用viewWithTag:方法,并相应地设置每个按钮标签,这样您就不必为每一个创建IBOutlets而烦恼。

答案 2 :(得分:0)

在您的情况下,我会为标签创建一个IBOutlet,为按钮创建一个IBAction。标签的IBOutlet将在用户按下按钮时更新文本。您的IBAction看起来像这样:

-(IBAction)digitPressed:(UIButton *)sender{

    //First you have to check if there is currently any text in the label
    //If there is not, the below line of code is performed
    NSString *textWithDigit = [[yourLabel.text] stringByAppendingString: sender.titleLabel];

    //This line updates the label's text
    label.text = textWithDigit;
}

我只输入与IBActions和IBOutlets相关的代码(为了更新文本,你需要一个标签的IBOutlet,你需要IBAction将标签的文本更改为按下的数字);需要更多代码(检查用户当前是否正在键入数字,代码为+, - ,*,/等操作的代码),但这只是一个开始。

希望这有帮助!