IBOutlet和IBAction


159

在Xcode和Interface Builder中使用IBOutlet和IBAction的目的是什么?

如果我不使用IBOutlets和IBAction,有什么区别吗?


迅速:

@IBOutlet weak var textField: UITextField!

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

目标C:

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

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

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

2
迈克尔·罗杰斯(Michael Rogers)的回答在以下内容中添加了一些解释,说明即使IBAction被忽略,代码为何仍然有效。
克里希纳

IBActions为目标,行动互动机制的一部分而存在,你可以阅读有关IBAction为如何融入这里:developer.apple.com/library/ios/documentation/General/... 你可以在这里阅读奥特莱斯起来:developer.apple。 com / library / ios / documentation / General /…
William Power

Answers:


208

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

IBAction解决voidIBOutlet解析为什么,但他们表示,以Xcode和接口生成器,这些变量和方法可以在Interface Builder被用来链接UI元素在你的代码。

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


@Jasarien“您需要为将在IB中使用的方法指定IBAction,并为将在IB中使用的对象指定IBOutlet。” 有什么不同 ?
cyrilchampier 2012年

3
@nerith方法和对象之间存在相同的区别。IBActions用于方法,IBOutlet用于对象。
Jasarien

为了澄清起见,由于我的帖子已被编辑,因此IBOutlet无法解析为id。考虑一下:IBOutlet UILabel *nameLabel;-如果IBOutlet解析为id,则将读取id UIlabel *namelabel;该代码,这将产生编译器错误。正如我最初所说,IBOutlet解决不了什么。
Jasarien 2012年

38

标记方法以使其出现在Interface Builder中并且可以拖动其连接的传统方法是使方法返回类型IBAction。但是,如果使方法无效(而是将IBAction #define定义为无效),并提供(id)参数,则该方法仍然可见。这样可以提供额外的灵活性

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

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

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


1
下面是上述引导件的链接提示:developer.apple.com/library/ios/recipes/...
侵略者

32

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

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

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

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


13
但是,如果不包括IBOutlet标签,为什么它仍然可以工作
bobobobo

7
因为这些宏在编译时不执行任何操作,所以它们只是简单地使Interface build应用程序可以在源代码中找到那些方法和interface builder文件,因此您可以在interface builder和您的代码之间进行拖动,因为建立连接时没有再重要了。
弥敦道日

至少在过去十年中,IBAction在编辑时也不执行任何操作。您也可以(void)在Interface Builder中连接方法。
J. Cocoe'9

7

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

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


7

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

通过查看流程,可以看到IBOutlets仅在此处将属性名称与Nib文件中的控件名称进行匹配。

nib文件的加载方式,Matt的iOS6在线丛书的屏幕截图


该答案解释 IBOutlets工作的原因方式,而不仅仅是它们的工作方式。
Jeffery Opoku-Mensah 2013年

4

插座是从代码到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。你从哪里得到这个主意的?
理查德·罗斯三世

3

IBAction和IBOutlets用于将您在Interface Builder中创建的接口与控制器连接起来。如果您不使用Interface Builder并完全用代码构建接口,则可以在不使用它们的情况下编写程序。但是实际上,我们大多数人都使用Interface Builder,一旦要在界面中实现一些交互性,就必须使用IBAction和IBoutlet。


2

IB插座

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

IB动作

  • 属性指示该方法是可以从Interface Builder的情节提要中连接到的操作。

@-动态模式IB-接口生成器


2

此问题的主要评论之一特别要求:

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


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

IB动作

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

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

但是,许多开发人员发现在方法声明中仍使用IBAction返回类型来表示特定方法通过操作连接很有用。即使不使用情节提要/ XIB的项目也可能选择使用IBAction来调出目标/操作方法。

IBOutlet:

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

与IBAction不同,仍需要IBOutlet才能将代码中的属性与情节提要或XIB中的对象挂钩。

通常在视图或控件与其管理视图控制器之间建立IBOutlet连接(通常除了响应者可能将视图控制器作为目标执行的任何IBAction之外,还执行此操作)。但是,IBOutlet也可以用于公开顶级属性,例如另一个控制器或可以由引用视图控制器访问的属性。


1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.