IBOutlet e IBAction

159

¿Cuál es el propósito de usar IBOutlets e IBActions en Xcode e Interface Builder?

¿Hay alguna diferencia si no uso IBOutlets e IBActions?


Rápido:

@IBOutlet weak var textField: UITextField!

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

C objetivo:

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

- (IBAction)buttonPressed:(id)sender { /* ... */ }
suse
fuente
12
Todas las respuestas mencionan el mismo tipo de idea ... pero nadie explica por qué Interface Builder parece funcionar igual si NO incluye IBAction / IBOutlet en su fuente. ¿Hay alguna otra razón para IBAction e IBOutlet o está bien dejarlos ?
bobobobo
2
La respuesta de Michael Rogers a continuación agrega un poco de explicación sobre por qué el código funciona incluso cuando se omite IBAction.
Krishna
IBActions existe como parte del mecanismo de interacción objetivo-acción, puede leer sobre cómo encaja IBAction en eso aquí: developer.apple.com/library/ios/documentation/General/… Puede leer en Outlets aquí: developer.apple. com / library / ios / documentation / General / ...
William Power

Respuestas:

208

IBActiony IBOutletson macros definidas para denotar variables y métodos a los que se puede hacer referencia en Interface Builder.

IBActionresuelve voidy no IBOutletresuelve nada, pero significan para Xcode y el generador de interfaces que estas variables y métodos pueden usarse en el generador de interfaces para vincular elementos de la interfaz de usuario a su código.

Si no va a usar Interface Builder en absoluto, entonces no los necesita en su código, pero si lo va a usar, debe especificar los IBActionmétodos que se usarán en IB y los IBOutletobjetos eso se usará en IB.

Jasarien
fuente
@Jasarien "debe especificar IBAction para los métodos que se utilizarán en IB e IBOutlet para los objetos que se utilizarán en IB". Cual es la diferencia ?
cyrilchampier
3
@nerith La misma diferencia que existe entre métodos y objetos. IBActions para métodos, IBOutlet para objetos.
Jasarien
Solo para aclarar, ya que mi publicación fue editada, IBOutletno se resuelve id. Considere esto: IBOutlet UILabel *nameLabel;si se IBOutletresuelve id, entonces ese código se leería, lo id UIlabel *namelabel;que produce un error del compilador. Como dije originalmente, no se IBOutletresuelve nada.
Jasarien
38

La forma tradicional de marcar un método para que aparezca en Interface Builder, y puede arrastrar una conexión a él, ha sido hacer que el método devuelva el tipo IBAction. Sin embargo, si hace que su método sea nulo, en cambio (IBAction es # define'd para ser nulo), y proporciona un argumento (id), el método sigue siendo visible. Esto proporciona flexibilidad adicional, al

Los 3 son visibles desde Interface Builder:

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

Consulte la Guía del usuario de Interface Builder de Apple para obtener más información, en particular la sección titulada Xcode Integration.

Michael Rogers
fuente
1
Aquí hay un enlace a la guía anterior sugerida: developer.apple.com/library/ios/recipes/…
Aggressor
32

Debe utilizar IBOutlet e IBAction si está utilizando el creador de interfaces (de ahí el prefijo IB) para sus componentes GUI. IBOutlet es necesario para asociar propiedades en su aplicación con componentes en IB, e IBAction se utiliza para permitir que sus métodos se asocien con acciones en IB.

Por ejemplo, suponga que define un botón y una etiqueta en IB. Para cambiar dinámicamente el valor de la etiqueta presionando el botón, definirá una acción y propiedad en su aplicación similar a:

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

Luego, en IB, conectaría myLabel con la etiqueta y el método pushme con el botón. Necesita IBAction e IBOutlet para que estas conexiones existan en IB.

ennuikiller
fuente
13
pero ¿por qué sigue funcionando si no incluye el etiquetado IBOutlet ...?
bobobobo
77
Debido a que estas macros no hacen nada en el momento de la compilación, son simplemente para que la aplicación de compilación de la interfaz pueda encontrar esos métodos y archivos del generador de interfaces en el código fuente para que pueda arrastrar entre el generador de interfaces y su código, una vez que se realiza la conexión, no Importa más.
Nathan Day
IBAction tampoco hace nada en el momento de la edición, al menos durante la última década. También puede conectar un (void)método en Interface Builder.
J. Cocoe
7

Interface Builder los usa para determinar qué miembros y mensajes se pueden 'conectar' a los controles de interfaz que está utilizando en su ventana / vista.

IBOutlet e IBAction están simplemente allí como marcadores que Interface Builder busca cuando analiza su código en tiempo de diseño, no tienen ningún efecto en el código generado por el compilador.

KazR
fuente
7

Me encontré con el diagrama mientras miraba la codificación de valores clave, pensé que podría ayudar a alguien. Ayuda a comprender qué es IBOutlet.

Al observar el flujo, se podría ver que IBOutlets solo están allí para hacer coincidir el nombre de la propiedad con un nombre de control en el archivo Nib.

Cómo se carga el archivo plumín, captura de pantalla del libro en línea de Matt para iOS6

NSCoder
fuente
Esta respuesta explica por qué y cómo funcionan los IBOutlets, no solo lo que hacen .
Jeffery Opoku-Mensah
4

Un Outlet es un enlace del código a la interfaz de usuario. Si desea mostrar u ocultar un elemento de la interfaz de usuario, si desea obtener el texto de un campo de texto o habilitar o deshabilitar un elemento (o un centenar de otras cosas), debe definir una salida de ese objeto en las fuentes y vincular esa salida a través del "objeto de interfaz" al elemento UI. Después de eso, puede usar la salida como cualquier otra variable en su codificación.

IBAction: un método especial activado por objetos de interfaz de usuario. Interface Builder los reconoce.

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

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

Para obtener más información, consulte Documentos de Apple

पवन
fuente
Uhm, no, eso no es un IBOutlet. ¿De dónde sacaste esa idea?
Richard J. Ross III
3

IBAction e IBOutlets se utilizan para conectar su interfaz hecha en Interface Builder con su controlador. Si no usara Interface Builder y construyera su interfaz completamente en código, podría hacer un programa sin usarlos. Pero, en realidad, la mayoría de nosotros usamos Interface Builder, una vez que desees que haya cierta interactividad en tu interfaz, tendrás que usar IBActions e IBoutlets.

Yannick Compernol
fuente
2

IBOutlet

  • Es una propiedad .
  • Cuando se carga el archivo nib (IB), se convierte en parte de los datos encapsulados que se conectan a una variable de instancia.
  • Cada conexión no está archivada y restablecida.

IBAction

  • El atributo indica que el método es una acción a la que puede conectarse desde su guión gráfico en Interface Builder.

@ - Patrón dinámico IB - Interface Builder

Vinoth Anandan
fuente
2

Uno de los principales comentarios sobre esta pregunta específicamente pregunta:

Todas las respuestas mencionan el mismo tipo de idea ... pero nadie explica por qué Interface Builder parece funcionar de la misma manera si NO incluye IBAction / IBOutlet en su fuente. ¿Hay alguna otra razón para IBAction e IBOutlet o está bien dejarlos?


NSHipster responde bien a esta pregunta:

IBAction

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

Ya en 2004 (y tal vez antes), IBAction ya no era necesario para que Interface Builder notara un método. Cualquier método con la firma -(void){name}:(id)sendersería visible en el panel de salidas.

Sin embargo, a muchos desarrolladores les resulta útil seguir utilizando el tipo de retorno IBAction en las declaraciones de métodos para denotar que un método en particular está conectado por una acción. Incluso los proyectos que no usan Storyboards / XIB pueden optar por emplear IBAction para invocar métodos de objetivo / acción.

IBOutlet:

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

A diferencia de IBAction, IBOutlet todavía es necesario para conectar propiedades en código con objetos en un Storyboard o XIB.

Por lo general, se establece una conexión IBOutlet entre una vista o control y su controlador de vista de gestión (esto a menudo se realiza además de cualquier IBActions que un respondedor podría realizar como objetivo de un controlador de vista). Sin embargo, un IBOutlet también se puede usar para exponer una propiedad de nivel superior, como otro controlador o una propiedad a la que luego podría acceder un controlador de vista de referencia.

pkamb
fuente
1

cuando usa Interface Builder, puede usar Connections Inspector para configurar los eventos con controladores de eventos, se supone que los controladores de eventos son las funciones que tienen el modificador IBAction. Se puede vincular una vista con la referencia para el mismo tipo y con el modificador IBOutlet.

Céfiro
fuente