0

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

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

4

3 回答 3

4

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

IBOutlet如果您只需要这样做,则不需要为每个按钮设置一个。

于 2012-06-29T00:58:34.053 回答
2

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

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

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

对于您的情况,您实际上不需要为按钮设置 IBOutlets,因为您不需要更改它们的任何内容,只需在按下它们时通知您。

请注意,如果您有这么多按钮,并且由于某种原因需要一种从代码中访问它们的方法来更改它们的某些内容,我不建议您使用 10 个 IBOutlets。相反,我会使用该viewWithTag:方法,并相应地设置每个按钮标签,这样您就不必费心为每个按钮创建 IBOutlets。

于 2012-06-29T01:02:53.100 回答
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 将标签的文本更改为按下的数字);需要更多代码(检查用户当前是否正在输入数字所需的代码,用于 +、-、*、/ 等操作的代码),但这只是一个开始。

希望这可以帮助!

于 2012-06-29T01:06:16.347 回答