IBOutlet 和 IBAction

Posted

技术标签:

【中文标题】IBOutlet 和 IBAction【英文标题】:IBOutlet and IBAction 【发布时间】:2010-12-11 05:02:24 【问题描述】:

在 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  /* ... */ 

【问题讨论】:

所有答案都提到了相同类型的想法.. 但没有人解释为什么如果您不在源代码中包含 IBAction/IBOutlet,Interface Builder 似乎工作方式相同。 IBAction 和 IBOutlet 是否还有其他原因,或者是否可以将它们关闭 Michael Rogers 的回答在下面添加了一些解释,说明为什么即使 IBAction 被忽略,代码也能正常工作。 IBAction 作为目标-动作交互机制的一部分存在,您可以在此处阅读有关 IBAction 如何适应该机制的信息:developer.apple.com/library/ios/documentation/General/… 您可以在此处阅读 Outlets:developer.apple.com/library/ios/documentation/General/… 【参考方案1】:

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

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

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

【讨论】:

@Jasarien “您需要为将在 IB 中使用的方法指定 IBAction,为将在 IB 中使用的对象指定 IBOutlet。”有什么区别? @nerith 方法和对象之间存在相同的差异。 IBActions 用于方法,IBOutlet 用于对象。 澄清一下,由于我的帖子已被编辑,IBOutlet 无法解析为 id。考虑一下:IBOutlet UILabel *nameLabel; - 如果IBOutlet 解析为id,那么该代码将读取id UIlabel *namelabel;,这会产生编译器错误。正如我最初所说,IBOutlet 解析为空。【参考方案2】:

标记方法以使其出现在 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 集成的部分。

【讨论】:

这里是上述指南建议的链接:developer.apple.com/library/ios/recipes/…【参考方案3】:

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

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

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

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

【讨论】:

但是如果不包含 IBOutlet 标签,为什么它仍然有效...? 因为这些宏在编译时什么都不做,所以界面构建应用程序可以在源代码中找到这些方法和界面构建器文件,这样您就可以在界面构建器和您的代码之间拖动,一个连接已建立,不再重要。 IBAction 在编辑时也不做任何事情,至少在过去的十年里。您也可以在 Interface Builder 中连接 (void) 方法。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

这个答案解释了为什么如何 IBOutlets工作,而不仅仅是他们做什么【参考方案6】:

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 Docs

【讨论】:

嗯,不,这不是 IBOutlet 是什么。你是从哪里得到这个想法的?【参考方案7】:

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

【讨论】:

【参考方案8】:

One of the top comments在这个问题上特别问:

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


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

IBAction

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

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

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

IBOutlet:

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

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

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

【讨论】:

【参考方案9】:

IBOutlet

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

IBA 动作

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

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

【讨论】:

【参考方案10】:

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

【讨论】:

以上是关于IBOutlet 和 IBAction的主要内容,如果未能解决你的问题,请参考以下文章

快速,为啥我必须使用 IBaction 或 IBOutlet 在代码和 UI 之间进行通信?

在代码中将 UIButton 连接到 IBOutlet 和 IBAction

拦截/以编程方式设置 IBOutlet 属性

接口生成器、@IBOutlet 以及 Swift 中委托和数据源的协议

IBOutlet pageControl 无效

IBOutlet pageControl无效