tags:

views:

199

answers:

2

How do you associate a -mouseUp: event with the -add: method of a NSArrayController? The -mouseUp: event lives in a different object but is #import'ed and instantiated in the object that holds the array being controlled.

Usually, with an NSButton you command-drag from the button to the NSArrayController's -add: method but obviously this is not possible with a mouse event.

-- ADDED CONTENT --
MATT: Thanks for the answer and on first read it made sense. Being a beginner to Obj-C/Cocoa with a procedural and NON-GUI language (PLM51 and C51 for embedded controllers) background, I'm having a hard time to grasp the practical implementation of IBOutlets and connecting. I have no problems with buttons and the like (i.e. visible things in IB) but here is what I understand: I need to declare -IBOutlet NSArrayControler * arryCtrl; in my myDocuments.h file. Now keep in mind, the object where I override the -mouseUp method is called Canvas and in myDocuments.h I have a Canvas * canvas declaration hence, I have a canvas object instantiated by myDocument at runtime. In IB, I drag from File's Owner (myDocument right) to ArrayController and a link is established BUT not to -add: as that option is not available. In the nib (myDocument) there is no object for Canvas But, in mouseUp (the canvas method), if I send a message to the IBOutput, i.e. [arrayCtrl add:self] arrayCtrl is not known.

Anyhow, I'm sure you guys are having a giggle as the answer is probably so obvious. However, I'm really trying to understand it all and realize that the problem is my novice coding. Thanks for pointing this newbie in the right direction

+2  A: 

In the class whose mouseUp: method you're overriding, you need to have some way of referencing the NSArrayController. This is usually done via IBOutlets. So, create an outlet in the class and connect it to the array controller in IB. That way, you can simply do whatever you want in the mouseUp: method:

- (void)mouseUp:(NSEvent *)theEvent
{
    [arrayControllerOutlet add:self];
}
Matt Ball
Ah! Thanks. I'll give that a go.
Joe
+2  A: 

The typical pattern here is to have your controller be a delegate of your canvas object. When you create your canvas you would then also send it a setDelegate:self message.

You might then define your delegate protocol with some messages:

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

Then in your -mouseUp: method of your canvas you simply send the appropriate message to the canvas' delegate.

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

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

Structuring your code this way allows you to easily reuse that Canvas object elsewhere and doesn't tie it in to the implementation of your Controller. Your controller is then free to create any objects it needs on the canvas in any way it needs to.

Ashley Clark
Thanks Ashley, I'll work through that. Appreciate the answer.
Joe