IBOutlet 和 IBAction

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

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


斯威夫特:

@IBOutlet weak var textField: UITextField!


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

目标 C:

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


- (IBAction)buttonPressed:(id)sender { /* ... */ }
176307 次浏览

如果您的 GUI 组件使用的是 Interface Builder (因此是 IB 前缀) ,则需要使用 IBoutlet 和 IBAction。需要使用 IBOutlet 将应用程序中的属性与 IB 中的组件关联起来,并使用 IBAction 将方法与 IB 中的操作关联起来。

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

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

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

IBAction 和 IBoutlet 被用来连接你的控制器 Interface Builder 的接口。如果你不想使用 Interface Builder 并且完全用代码来构建你的界面,你可以不用它们来编写程序。但实际上,我们大多数人使用的是 Interface Builder,一旦你想在界面中获得一些交互性,你就必须使用 IBActions 和 IBoutts。

IBActionIBOutlet是定义来表示可以在 Interface Builder 中引用的变量和方法的宏。

IBAction分辨率为 void,而 IBOutlet分辨率为零,但它们对 Xcode 和 Interface Builder 意味着,这些变量和方法可以在 Interface Builder 中用于将 UI 元素链接到代码。

如果你不打算使用 Interface Builder,那么你不需要在你的代码中使用它们,但是如果你打算使用它,那么你需要为将在 iB 中使用的方法指定 IBAction,为将在 iB 中使用的对象指定 IBOutlet

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

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

标记一个方法的传统方法是使方法返回类型为 IBAction,这样它就会出现在 Interface Builder 中,并且你可以拖动一个连接到它。但是,如果您使您的方法变为 void (IBAction 是 # Definition’d be void) ,并提供一个(id)参数,那么该方法仍然是可见的。这提供了额外的灵活性 Al

所有这些都可以从 Interface Builder 上看到:

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

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

Outlet 是从代码到 UI 的链接。如果你想显示或隐藏一个 UI 元素,如果你想得到一个文本字段的文本,或者启用或禁用一个元素(或者其他上百个元素) ,你必须在源代码中定义一个该对象的出口,并通过“ interface object”将该出口链接到 UI 元素。之后,您可以使用的出口,就像任何其他变量在您的编码。

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

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


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

详情请参阅 苹果文档

当你使用 Interface Builder 时,你可以使用连接检查器来设置事件处理程序,事件处理程序应该是具有 IBAction 修饰符的函数。视图可以链接到相同类型的引用和 IBOutlet 修饰符。

在查看键值编码时偶然发现了这个图表,以为它可以帮助某人。它有助于理解 IBOutlet 是什么。

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

How nib file is loaded, screenshot of Matt's online book for iOS6

IBOutlet

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

IBAction

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

@-动态模式 Interface Builder

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

所有的答案都提到了同样的想法。.但是没有人解释为什么在你的源代码中没有包含 IBAction/IBoutlet 的情况下,Interface Builder 看起来还是一样的。IBAction 和 IBOutlet 还是可以不戴?还有其他原因吗


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

IBAction

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

早在2004年(也许更早) ,Interface Builder 就注意到了 IBAction 不再是必要的的方法。任何具有 -(void){name}:(id)sender签名的方法都可以在输出窗格中看到。

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

IBOutlet:

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

与 IBAction 不同,IBOutlet 仍然是必需的用于将代码中的属性与 Storyboard 或 XIB 中的对象挂接起来。

IBOutlet 连接通常在视图或控件及其管理视图控制器之间建立(这通常是在视图控制器可能由响应者执行的任何 IBActions 之外完成的)。但是,IBOutlet 也可用于公开顶级属性,如其他控制器或属性,然后引用视图控制器可以访问这些属性。

我不知道你不再需要它们了,它们曾经让 Interface Builder 在你的源代码中找到它们成为可能,在雨燕中我会想象 IBAction 仍然需要,因为它需要改变你的方法从 Interface Builder 调用的方式,尽管我想象@objecc 会做同样的事情。我个人打算继续使用它们,因为它记录了方法或接口应该做什么。