IBOutlet et IBAction

159

Quel est le but d'utiliser IBOutlets et IBActions dans Xcode et Interface Builder?

Cela fait-il une différence si je n'utilise pas IBOutlets et IBActions?


Rapide:

@IBOutlet weak var textField: UITextField!

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

Objectif c:

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

- (IBAction)buttonPressed:(id)sender { /* ... */ }
suse
la source
12
Toutes les réponses mentionnent le même type d'idée ... mais personne n'explique pourquoi Interface Builder semble fonctionner de la même manière si vous N'incluez PAS IBAction / IBOutlet dans votre source. Y a-t-il une autre raison pour IBAction et IBOutlet ou est-il acceptable de les laisser de côté ?
bobobobo
2
La réponse de Michael Rogers ci-dessous ajoute un peu d'explication sur la raison pour laquelle le code fonctionne même lorsque IBAction est omis.
Krishna
IBActions existe dans le cadre du mécanisme d'interaction cible-action, vous pouvez en savoir plus sur la façon dont IBAction s'intègre ici: developer.apple.com/library/ios/documentation/General/... Vous pouvez lire sur Outlets ici: developer.apple. com / library / ios / documentation / General /…
William Power

Réponses:

208

IBActionet IBOutletsont des macros définies pour désigner des variables et des méthodes auxquelles il est possible de faire référence dans Interface Builder.

IBActionrésout voidet IBOutletrésout en rien, mais ils signifient pour Xcode et Interface Builder que ces variables et méthodes peuvent être utilisées dans Interface builder pour lier des éléments d'interface utilisateur à votre code.

Si vous n'utilisez pas du tout Interface Builder, vous n'en avez pas besoin dans votre code, mais si vous comptez l'utiliser, vous devez spécifier les IBActionméthodes qui seront utilisées dans IB et IBOutletpour les objets qui sera utilisé dans IB.

Jasarien
la source
@Jasarien "vous devez spécifier IBAction pour les méthodes qui seront utilisées dans IB et IBOutlet pour les objets qui seront utilisés dans IB." Quelle est la différence ?
cyrilchampier
3
@nerith La même différence qui existe entre les méthodes et les objets. IBActions pour les méthodes, IBOutlet pour les objets.
Jasarien
Juste pour clarifier, puisque mon message a été modifié, IBOutletne résout pas id. Considérez ceci: IBOutlet UILabel *nameLabel;- si IBOutletrésolu en id, alors ce code sera lu, id UIlabel *namelabel;ce qui produit une erreur de compilation. Comme je l'ai dit au départ, ne IBOutletrésout rien.
Jasarien
38

La façon traditionnelle de marquer une méthode pour qu'elle apparaisse dans Interface Builder et que vous puissiez y faire glisser une connexion a été de faire en sorte que la méthode renvoie le type IBAction. Cependant, si vous rendez votre méthode vide, à la place (IBAction est # définie comme vide), et fournissez un argument (id), la méthode est toujours visible. Cela offre une flexibilité supplémentaire, al

Tous les 3 sont visibles depuis Interface Builder:

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

Pour plus de détails, consultez le Guide de l'utilisateur d'Apple Interface Builder, en particulier la section intitulée Intégration Xcode.

Michael Rogers
la source
1
Voici un lien vers le guide ci-dessus suggéré: developer.apple.com/library/ios/recipes/…
Aggressor
32

Vous devez utiliser IBOutlet et IBAction si vous utilisez le générateur d'interface (d'où le préfixe IB) pour vos composants GUI. IBOutlet est nécessaire pour associer les propriétés de votre application à des composants dans IB, et IBAction est utilisé pour permettre à vos méthodes d'être associées à des actions dans IB.

Par exemple, supposons que vous définissiez un bouton et une étiquette dans IB. Pour modifier dynamiquement la valeur de l'étiquette en appuyant sur le bouton, vous définissez une action et une propriété dans votre application similaire à:

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

Ensuite, dans IB, vous connectez myLabel à l'étiquette et connectez la méthode pushme avec le bouton. Vous avez besoin d'IBAction et d'IBOutlet pour que ces connexions existent dans IB.

ennuikiller
la source
13
mais pourquoi cela fonctionne-t-il encore si vous n'incluez pas l'étiquetage IBOutlet ..?
bobobobo
7
Parce que ces macros ne font rien au moment de la compilation, elles le sont simplement pour que l'application de construction d'interface puisse trouver ces méthodes et ces fichiers de générateur d'interface dans le code source afin que vous puissiez faire glisser entre le générateur d'interface et votre code, une fois la connexion établie, ce n'est pas le cas. importe plus.
Nathan Day
IBAction ne fait rien non plus au moment de l'édition, au moins pendant la dernière décennie. Vous pouvez également connecter une (void)méthode dans Interface Builder.
J. Cocoe
7

Interface Builder les utilise pour déterminer quels membres et messages peuvent être «connectés» aux commandes d'interface que vous utilisez dans votre fenêtre / vue.

IBOutlet et IBAction sont uniquement là en tant que marqueurs recherchés par Interface Builder lorsqu'il analyse votre code au moment de la conception, ils n'ont aucun effet sur le code généré par le compilateur.

KazR
la source
7

Ran dans le diagramme tout en regardant le codage clé-valeur, pensant que cela pourrait aider quelqu'un. Cela aide à comprendre ce qu'est IBOutlet.

En regardant le flux, on pouvait voir que les IBOutlets ne sont là que pour faire correspondre le nom de la propriété avec un nom de contrôle dans le fichier Nib.

Comment le fichier nib est chargé, capture d'écran du livre en ligne de Matt pour iOS6

NSCoder
la source
Cette réponse explique pourquoi et comment les IBOutlets fonctionnent, pas seulement ce qu'ils font .
Jeffery Opoku-Mensah
4

Un Outlet est un lien entre le code et l'interface utilisateur. Si vous souhaitez afficher ou masquer un élément de l'interface utilisateur, si vous souhaitez obtenir le texte d'un champ de texte ou activer ou désactiver un élément (ou une centaine d'autres choses), vous devez définir une sortie de cet objet dans les sources et lier cette prise. via l '«objet interface» vers l'élément UI. Après cela, vous pouvez utiliser la prise comme n'importe quelle autre variable de votre codage.

IBAction - une méthode spéciale déclenchée par des objets d'interface utilisateur. Interface Builder les reconnaît.

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

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

Pour plus d'informations, veuillez consulter Apple Docs

पवन
la source
Euh, non, ce n'est pas ce qu'est un IBOutlet. D'où tiens-tu cette idée?
Richard J.Ross III
3

IBAction et IBOutlets sont utilisés pour connecter votre interface créée dans Interface Builder avec votre contrôleur. Si vous n'utilisez pas Interface Builder et construisez votre interface complètement dans le code, vous pouvez créer un programme sans les utiliser. Mais en réalité, la plupart d'entre nous utilisent Interface Builder, une fois que vous voulez obtenir une certaine interactivité dans votre interface, vous devrez utiliser IBActions et IBoutlets.

Yannick Compernol
la source
2

IBOutlet

  • C'est une propriété .
  • Lorsque le fichier nib (IB) est chargé, il fait partie des données encapsulées qui se connectent à une variable d'instance.
  • Chaque connexion est désarchivée et rétablie.

IBAction

  • L'attribut indique que la méthode est une action à laquelle vous pouvez vous connecter à partir de votre storyboard dans Interface Builder.

@ - Modèle dynamique IB - Générateur d'interface

Vinoth Anandan
la source
2

L'un des principaux commentaires sur cette question demande spécifiquement:

Toutes les réponses mentionnent le même type d'idée ... mais personne n'explique pourquoi Interface Builder semble fonctionner de la même manière si vous N'incluez PAS IBAction / IBOutlet dans votre source. Y a-t-il une autre raison pour IBAction et IBOutlet ou est-il acceptable de les laisser de côté?


Cette question est bien répondue par NSHipster:

IBAction

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

Dès 2004 (et peut-être plus tôt), IBAction n'était plus nécessaire pour qu'une méthode soit remarquée par Interface Builder. Toute méthode avec la signature -(void){name}:(id)senderserait visible dans le volet des prises.

Néanmoins, de nombreux développeurs trouvent utile de toujours utiliser le type de retour IBAction dans les déclarations de méthode pour indiquer qu'une méthode particulière est connectée par une action. Même les projets n'utilisant pas de Storyboards / XIB peuvent choisir d'utiliser IBAction pour appeler des méthodes cible / action.

IBOutlet:

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

Contrairement à IBAction, IBOutlet est toujours nécessaire pour connecter des propriétés dans le code avec des objets dans un Storyboard ou XIB.

Une connexion IBOutlet est généralement établie entre une vue ou un contrôle et son contrôleur de vue de gestion (cela est souvent fait en plus de toutes les IBActions qu'un contrôleur de vue pourrait être ciblé pour effectuer par un répondeur). Cependant, un IBOutlet peut également être utilisé pour exposer une propriété de niveau supérieur, comme un autre contrôleur ou une propriété à laquelle un contrôleur de vue référençant pourrait alors accéder.

pkamb
la source
1

lorsque vous utilisez Interface Builder, vous pouvez utiliser l'inspecteur de connexions pour configurer les événements avec des gestionnaires d'événements, les gestionnaires d'événements sont censés être les fonctions qui ont le modificateur IBAction. Une vue peut être liée à la référence du même type et au modificateur IBOutlet.

Zéphyr
la source