2009-10-29 16 views
146

¿Cuál es el propósito de usar IBAction e IBOutlet en la codificación Objective-C para el iPhone, ¿hay alguna diferencia si no los uso?IBOutlet e IBAction

+12

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

+2

La respuesta de Michael Rogers a continuación agrega un poco de una explicación sobre por qué el código funciona incluso cuando IBAction se omite. – Krishna

+0

Las interacciones de IB existen como parte del mecanismo de interacción de acción de objetivo, puede leer acerca de cómo encaja IBAction en esto aquí: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Target-Action/ Target-Action.html # // apple_ref/doc/uid/TP40010810-CH12 Puede leer en Outlets aquí: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Outlets /Outlets.html#//apple_ref/doc/uid/TP40010810-CH10-SW1 –

Respuesta

194

IBAction y IBOutlet son macros definidas para indicar variables y métodos a los que se puede hacer referencia en el Generador de interfaces.

IBAction resuelve a void y IBOutlet resuelve nada, pero que significan a constructor de Xcode e interfaz que estas variables y métodos se pueden utilizar en constructor de interfaz para unir elementos de la interfaz de su código.

Si no vas a utilizar Interface Builder en absoluto, entonces no los necesitas en tu código, pero si vas a usarlo, entonces debes especificar IBAction para los métodos que se usarán en IB y IBOutlet para objetos que se utilizarán en IB.

+0

@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." ¿Cuál es la diferencia? – cyrilchampier

+3

@nerith La misma diferencia que existe entre métodos y objetos. IBAcciones para métodos, IBOutlet para objetos. – Jasarien

+0

Solo para aclarar, ya que mi publicación fue editada, 'IBOutlet' no se resuelve en' id'. Considere esto: 'IBOutlet UILabel * nameLabel;' - si 'IBOutlet' resolvió' id', entonces ese código leería 'id UIlabel * namelabel;' que produce un error de compilación. Como dije originalmente, 'IBOutlet' no resuelve nada. – Jasarien

30

Debe usar IBOutlet e IBAction si está utilizando el constructor de interfaces (de ahí el prefijo IB) para sus componentes de la 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, supongamos que define un botón y una etiqueta en IB. Para cambiar dinámicamente el valor de la etiqueta pulsando el botón, definirá una acción y propiedad en su aplicación similar a:

UILabel IBOutlet *myLabel; 
-(IBAction) pushme; 

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

+13

, pero ¿por qué __sta funciona__ si no incluye el etiquetado IBOutlet ..? – bobobobo

+7

Dado que estas macros no hacen nada en tiempo de compilación, son simplemente para que la aplicación de compilación de interfaz pueda encontrar esos métodos y archivos de compilador de interfaz en el código fuente para que pueda arrastrar entre el constructor de interfaz y su código, uno establece que la conexión no funciona importa más –

+0

IBAction no hace nada en el tiempo de edición, tampoco, durante al menos la última década. También puede conectar un método '(void)' en Interface Builder. –

3

IBAction y IBOutlets se utilizan para conectar su interfaz hecha en Interface Builder con su controlador. Si no usa Interface Builder y construye su interfaz completamente en código, podría crear un programa sin usarlo. Pero en realidad, la mayoría de nosotros usamos el Interface Builder, una vez que desee obtener algo de interactividad en su interfaz, deberá usar IBActions y IBoutlets.

5

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

IBOutlet y IBAction son puramente como marcadores que Interface Builder busca cuando analiza el código en tiempo de diseño, no tienen ningún efecto sobre el código generado por el compilador.

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 su lugar (IBAction es # define'd para ser nulo), y proporciona un argumento (id), el método aún es visible. Esto proporciona mayor flexibilidad, al

Todos los 3 de ellos son visibles desde el Interface Builder:

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

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

+1

Aquí hay un enlace a la guía anterior sugerida: https://developer.apple.com/library/ios/recipes/xcode_help-interface_builder/_index.html – Aggressor

3

Un Outlet es un enlace del código a la IU. Si desea mostrar u ocultar un elemento UI, si desea obtener el texto de un campo de texto o habilitar o deshabilitar un elemento (u otras cien 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: método especial desencadenado 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 más información, consulte Apple Docs

+0

Uhm, no, eso no es lo que es un IBOutlet. ¿De dónde sacaste esa idea? –

+0

He editado mi respuesta –

1

cuando se utiliza el Interface Builder, se puede utilizar conexiones inspector de configurar los eventos con los manejadores de eventos, se supone que los controladores de eventos a ser las funciones que tienen el IBAction modificador Una vista se puede vincular con la referencia para el mismo tipo y con el modificador IBOutlet.

2

Apareció en 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 puede ver que IBOutlets solo están allí para hacer coincidir el nombre de la propiedad con un nombre de control en el archivo Nib.

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

+0

Esta respuesta explica _why_ y _how_ IBOutlets funcionan, no solo _ lo que hacen_. –

Cuestiones relacionadas