166

在 Xcode 和 Interface Builder 中使用 IBOutlets 和 IBActions 的目的是什么?

如果我不使用 IBOutlets 和 IBActions 会有什么不同吗?


迅速:

@IBOutlet weak var textField: UITextField!

@IBAction func buttonPressed(_ sender: Any) { /* ... */ }

目标-C:

@property (nonatomic, weak) IBOutlet UITextField *textField;

- (IBAction)buttonPressed:(id)sender { /* ... */ }
4

11 回答 11

215

IBAction并且IBOutlet是定义为表示可以在 Interface Builder 中引用的变量和方法的宏。

IBAction解析voidIBOutlet解析为无,但它们向 Xcode 和 Interface builder 表明这些变量和方法可以在 Interface builder 中用于将 UI 元素链接到您的代码。

如果您根本不打算使用 Interface Builder,那么您的代码中就不需要它们,但是如果您要使用它,那么您需要指定IBAction将在 IB 中使用的方法和IBOutlet对象将在 IB 中使用。

于 2009-10-29T11:22:03.187 回答
38

标记方法以使其出现在 Interface Builder 中并且您可以拖动连接到它的传统方法是使方法返回类型 IBAction。但是,如果您使您的方法无效,而不是(IBAction 是#define'd 无效),并提供一个 (id) 参数,该方法仍然是可见的。这提供了额外的灵活性,al

所有这 3 个都可以从 Interface Builder 中看到:

-(void) someMethod1:(id) sender; 
-(IBAction) someMethod2; 
-(IBAction) someMethod3:(id) sender;

有关详细信息,请参阅 Apple 的 Interface Builder 用户指南,尤其是标题为 Xcode 集成的部分。

于 2010-12-12T17:06:57.780 回答
32

如果您为 GUI 组件使用界面构建器(因此使用 IB 前缀),则需要使用 IBOutlet 和 IBAction。IBOutlet 用于将应用程序中的属性与 IB 中的组件相关联,而 IBAction 用于允许您的方法与 IB 中的操作相关联。

例如,假设您在 IB 中定义了一个按钮和标签。要通过按下按钮动态更改标签的值,您将在您的应用程序中定义一个动作和属性,类似于:

UILabel IBOutlet *myLabel;
- (IBAction)pushme:(id)sender;

然后在 IB 中,您将 myLabel 与标签连接,并将 pushme 方法与按钮连接。您需要 IBAction 和 IBOutlet 才能使这些连接存在于 IB 中。

于 2009-10-29T11:19:32.647 回答
7

Interface Builder 使用它们来确定哪些成员和消息可以“连接”到您在窗口/视图中使用的界面控件。

IBOutlet 和 IBAction 纯粹是作为 Interface Builder 在设计时解析代码时寻找的标记,它们对编译器生成的代码没有任何影响。

于 2009-10-29T11:31:11.063 回答
7

在查看键值编码时进入图表,认为它可能对某人有所帮助。它有助于理解什么是 IBOutlet。

通过查看流程,可以看到 IBOutlets 仅用于将属性名称与 Nib 文件中的控件名称匹配。

nib文件是如何加载的,Matt的iOS6网书截图

于 2016-04-18T18:58:50.220 回答
4

Outlet 是从代码到 UI 的链接。如果要显示或隐藏 UI 元素,如果要获取文本字段的文本或启用或禁用元素(或其他一百个元素),则必须在源中定义该对象的出口并链接该出口通过“界面对象”传递给 UI 元素。之后,您可以像使用编码中的任何其他变量一样使用插座。

IBAction – 一种由用户界面对象触发的特殊方法。Interface Builder 可以识别它们。

@interface Controller
{
  IBOutlet id textField; // links to TextField UI object
}

- (IBAction)doAction:(id)sender; // e.g. called when button pushed

有关详细信息,请参阅Apple 文档

于 2012-08-10T05:02:53.907 回答
3

IBAction 和 IBOutlets 用于将您在 Interface Builder 中制作的界面与您的控制器连接起来。如果您不使用 Interface Builder 并完全用代码构建您的界面,您可以在不使用它们的情况下制作程序。但实际上我们大多数人都使用 Interface Builder,一旦你想在你的界面中获得一些交互性,你将不得不使用 IBActions 和 IBoutlets。

于 2009-10-29T11:20:30.167 回答
3

关于这个问题的最高评论之一特别要求:

所有答案都提到了相同类型的想法。但没有人解释为什么如果您的源代码中不包含 IBAction/IBOutlet,Interface Builder 的工作方式似乎相同。IBAction 和 IBOutlet 是否还有其他原因,或者可以将它们关闭吗?


NSHipster 很好地回答了这个问题:

IBA动作

https://nshipster.com/ibaction-iboutlet-iboutletcollection/#ibaction

早在 2004 年(也许更早),IBAction 就不再需要让 Interface Builder 注意到方法了。任何带有签名的方法-(void){name}:(id)sender都将在出口窗格中可见。

尽管如此,许多开发人员发现在方法声明中仍然使用 IBAction 返回类型来表示特定方法通过操作连接是有用的。即使是不使用 Storyboards/XIBs 的项目也可以选择使用 IBAction 来调用目标/动作方法。

IB出口:

https://nshipster.com/ibaction-iboutlet-iboutletcollection/#iboutlet

与 IBAction 不同,IBOutlet 仍然需要将代码中的属性与 Storyboard 或 XIB 中的对象挂钩。

IBOutlet 连接通常在视图或控件与其管理视图控制器之间建立(这通常是在视图控制器可能针对响应者执行的任何 IBAction 之外完成的)。但是,IBOutlet 也可用于公开顶级属性,如另一个控制器或随后可由引用视图控制器访问的属性。

于 2019-12-10T04:42:10.837 回答
2

IBOutlet

  • 它是一种财产
  • 加载 nib(IB) 文件时,它成为连接到实例变量的封装数据的一部分。
  • 每个连接都被取消归档并重新建立。

IBA动作

  • 属性表示该方法是一个动作,您可以从 Interface Builder 中的故事板连接到该动作。

@ - 动态模式 IB - 界面生成器

于 2019-01-17T13:07:07.730 回答
1

当您使用 Interface Builder 时,您可以使用 Connections Inspector 设置带有事件处理程序的事件,事件处理程序应该是具有 IBAction 修饰符的函数。视图可以与相同类型的引用和 IBOutlet 修饰符链接。

于 2015-02-02T22:01:51.007 回答
0

我不知道您不再需要它们,它们曾经使界面构建器可以在您的源代码中找到它们,很快我会认为仍然需要 IBAction,因为它需要更改您的方法可以从界面生成器调用,尽管我成像 @objc 会做同样的事情。我个人打算继续使用它们,因为它记录了方法或接口应该做什么。

于 2022-02-09T09:20:55.963 回答