2008-12-09 6 views
1

Comment associer un événement -mouseUp: à la méthode -add: d'un NSArrayController? L'événement -mouseUp: réside dans un objet différent mais est #import 'ed et instancié dans l'objet qui contient le tableau en cours de contrôle.MouseUp et NSArrayController

Généralement, avec un NSButton, vous faites glisser la commande du bouton à la méthode -add: de NSArrayController, mais évidemment, cela n'est pas possible avec un événement souris. MATT: Merci pour la réponse et en première lecture, cela a du sens. Étant un débutant à Obj-C/Cocoa avec un fond de langage procédural et NON-GUI (PLM51 et C51 pour les contrôleurs embarqués), j'ai du mal à comprendre l'implémentation pratique d'IBOutlets et la connexion. Je n'ai aucun problème avec les boutons et autres (c'est-à-dire les choses visibles dans IB) mais voici ce que je comprends: J'ai besoin de déclarer -IBOutlet NSArrayControler * arryCtrl; dans mon fichier myDocuments.h. Maintenant, gardez à l'esprit, l'objet où je substitue la méthode -mouseUp est appelé Canvas et dans myDocuments.h j'ai une déclaration Canvas * canvas donc, j'ai un objet canvas instancié par myDocument à l'exécution. Dans IB, je fais glisser du propriétaire du fichier (myDocument right) à ArrayController et un lien est établi MAIS pas à -add: car cette option n'est pas disponible. Dans la plume (myDocument) il n'y a pas d'objet pour Canvas Mais, dans mouseUp (la méthode canvas), si j'envoie un message à l'IBOutput, c'est-à-dire [arrayCtrl add:self] arrayCtrl n'est pas connu.

De toute façon, je suis sûr que vous avez un petit rire comme la réponse est probablement si évidente. Cependant, j'essaie vraiment de tout comprendre et de réaliser que le problème est mon codage novice. Merci de pointer ce débutant dans la bonne direction

Répondre

2

Le modèle typique est là pour que votre contrôleur soit un délégué de votre objet de toile. Lorsque vous créez votre canevas, vous lui envoyez également un message setDelegate:self.

Vous pouvez alors définir votre protocole délégué avec quelques messages:

@protocol MyCanvasProtocol 
@optional 
-(void)canvas:(Canvas *)canvas mouseUp:(NSEvent *)event; 
-(void)canvas:(Canvas *)canvas objectSelected:(id)theObject; 
@end 

Ensuite, dans votre méthode -mouseUp: de votre toile vous envoyer simplement le message approprié au délégué de la toile.

- (void)mouseUp:(NSEvent *)event { 
    // some mouse up code 

    if ([delegate respondsToSelector:@selector(canvas:mouseUp:)]) 
     [delegate canvas:self mouseUp:event]; 
} 

Structurer votre code de cette façon vous permet de réutiliser facilement cet objet Toile ailleurs et ne lie pas dans la mise en œuvre de votre contrôleur. Votre contrôleur est alors libre de créer les objets dont il a besoin sur le canevas de la façon dont il le faut.

+0

Merci Ashley, je vais travailler à travers ça. Appréciez la réponse. – Joe

2

Dans la classe dont vous avez surchargé la méthode mouseUp:, vous devez avoir un moyen de référencer NSArrayController. Ceci est généralement effectué via IBOutlets. Donc, créez une sortie dans la classe et connectez-la au contrôleur RAID dans IB. De cette façon, vous pouvez tout simplement faire ce que vous voulez dans la méthode mouseUp::

- (void)mouseUp:(NSEvent *)theEvent 
{ 
    [arrayControllerOutlet add:self]; 
} 
+0

Ah! Merci. Je vais essayer. – Joe

Questions connexes