You mentioned that things are working perfectly except for the drawing. I did 
notice that, I am not dismissing that, I just want to confirm some simple 
things in an effort to help...

On Jul 24, 2011, at 1:11 PM, Tom Jeffries wrote:

> I appreciate the answers, so far everything that's been suggested is
> something I've tried.  Maybe if I put the code out somebody will see what
> I'm doing wrong:
> 
> This is the function that is called by the mouse click, it's in another
> module:
> 
> + (BOOL) Play
> 
> {
> 
> // init code
> 
> [SequeraStepWindow DrawCurrentBarNotes];
> 
> }

You are sure this method is being called, right? If so, please tell us how you 
are sure.

"Play" is a class method, so I'm going to guess that SequeraStepWindow is a 
global variable. How are you initializing SequeraStepWindow? I wonder if you're 
under-retaining it -- although you'd probably have crashed if that was the 
case. Can you show us where you declare the variable and where you assign it a 
value?

Have you checked that SequeraStepWindow is not nil at this point in the code? 
Sending a message to nil is a no-op. This is a common pitfall for newcomers to 
Cocoa.

> It calls this function in the NSView module:
> 
> - (void) DrawCurrentBarNotes
> 
> {
> 
> drawNotesFlag = YES; // This flag tells drawRect to draw the notes next time
> 
> [self DrawNotes]; // this is where the drawing takes place

This is not the way to do it. All drawing must be done by drawRect: except in 
some cases that don't or shouldn't apply to you if you're writing a 
straightforward app and especially if you're new to the platform. You don't 
call drawing methods; you implement drawing in drawRect: and let the Cocoa 
runtime call drawRect: at the appropriate times. Only drawRect: should be 
calling DrawNotes.

Analyzing a little further -- the typical Cocoa pattern for what you're trying 
to do here is to have a setter method for the property "drawNotesFlag". It 
often looks like this:

- (void)setDrawNotesFlag:(BOOL)newFlag
{
    drawNotesFlag = newFlag;
    [self setNeedsDisplay:YES];
}

> I've tried all of these to invoke drawRect, no luck
> 
> //[self awakeFromNib];
> 
> //[super awakeFromNib];
> 
> //[SequeraStepWindow awakeFromNib];
> 
> //[SequeraStepWindow setNeedsDisplay: YES];
> 
> //[self setNeedsDisplay: YES];
> 
> //[super setNeedsDisplay: YES];

You are flailing. awakeFromNib is another method that you do not call, you only 
implement. (The exception would be an implementation of awakeFromNib that needs 
to call [super awakeFromNib], but this is not your situation.) Furthermore, 
awakeFromNib is meant to be called exactly once after the nib is loaded.

The right answer is [self setNeedsDisplay:YES].

> Here's drawRect, which gets called properly on start up but does not get
> called afterwards
> 
> - (void)drawRect:(NSRect)dirtyRect {
> 
> [self DrawStepArea]; // Always draw the step area
> 
> // don't draw the notes on program startup
> 
> if(drawNotesFlag == YES) // if I comment this out DrawNotes works fine
> 
> [self DrawNotes];
> 
> }
> 
> Somebody suggested using NSLog, which I haven't done.

Another common pitfall is not understanding nib files and thus having more 
instances of a view than you think you have. I suggest you put the following in 
the awakeFromNib of your view class:

    NSLog(@"awakeFromNib -- %@", self);

This will print the address of the view instance. From your code I would guess 
you should see this log message exactly once. If you see it more than once, 
that is a major clue.

> However I've been
> using breakpoints and tracing through the code, which I assume should be
> just as valid.  Everything works perfectly- except drawRect doesn't get
> called.

Wait a minute. You've been telling us drawRect: doesn't get called, but above 
you have a comment that says DrawNotes works fine if you comment out an 
if-test. Which is it? If it's simply a matter of drawNotesFlag not having been 
properly set to YES, then that is a major clue. Maybe the problem is that 
DrawCurrentBarNotes is not getting called (hence my question above).

--Andy

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to