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 ([email protected])
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 [email protected]