• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Binding InfoPanel to currentDocument
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Binding InfoPanel to currentDocument


  • Subject: Re: Binding InfoPanel to currentDocument
  • From: Kyle Sluder <email@hidden>
  • Date: Fri, 26 Oct 2012 02:11:06 -0700

On Oct 26, 2012, at 1:52 AM, "Gerriet M. Denkmann" <email@hidden> wrote:

>
> On 26 Oct 2012, at 01:11, Seth Willits <email@hidden> wrote:
>
>> On Oct 25, 2012, at 4:36 AM, Gerriet M. Denkmann wrote:
>>
>>> This works, but I have a strong feeling that there is a very obvious better solution which I somehow cannot see.
>>
>>
>> There actually isn't an obvious solution.
>
> Strange.
> I thought that having some InfoPanel which shows data of the current NSDocument would be a fairly common scenario.
> But anyway.
>
> I decided to follow your suggestions.
>
> My app delegate now has:
> @property (strong) GmdDocument *currentDocument;
>
> In applicationDidFinishLaunching: it registers for NSWindowDidBecomeMainNotification and NSWindowWillCloseNotification (not for NSWindowDidResignMainNotification because I want my InfoPanel to keep it's data when some other app becomes active).
>
> The notification method is:
>
> - (void)someWindowChanged: (NSNotification *)noti
> {
>    NSWindow *window = [ noti object ];
>
>    if ( ![ window isMemberOfClass: [ NSWindow class ] ] ) return;    //    ignore non-Windows

This check is wrong because it is too strict; it will fail for NSWindow subclasses including NSPanel. The proper check here is -isKindOfClass:.

But it's also completely unnecessary because nothing besides NSWindows will ever post NSWindowDidBecomeMain/WillCloseNotification. Delete it.

>
>    NSWindowController *windowController = [ window windowController ];
>    if ( windowController == nil ) return;    //    ignore strange windows

NSWindow has a -document accessor. Use that instead of going though the window controller.

>
>    GmdDocument *document = [ windowController document ];
>    if ( ![ document isKindOfClass: [ GmdDocument class ] ] ) return;    //    ignore strange documents

This will bail out early without setting currentDocument if the new window has no document. That's probably not want you want.

>
>    if ( [ [ noti name ] isEqualToString: NSWindowWillCloseNotification ] ) document = nil;
>
>    self.currentDocument = document;
> }

Here's how I would write this method:

- (void)someWindowChanged:(NSNotification *)note;
{
  if([note.name isEqualToString:NSWindowDidCloseNotification]) {
    self.currentDocument = nil;
  } else /* NSWindowDidBecomeMainNotification */ {
    NSWindow *window = note.object;
    NSDocument *doc = window.document;
    if ([window isKindOfClass:[GmdDocument class]])
      self.currentDocument = doc;
    else
      self.currentDocument = nil;
  }
}

Actually, I wouldn't write this method at all. I'd use the new block-based NSNotification API and register different blocks for NSWindowDidCloseNotification and NSWindowDidBecomeMainNotification.

--Kyle Sluder
_______________________________________________

Cocoa-dev mailing list (email@hidden)

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:

This email sent to email@hidden

  • Follow-Ups:
    • Re: Binding InfoPanel to currentDocument
      • From: "Gerriet M. Denkmann" <email@hidden>
References: 
 >Re: Binding InfoPanel to currentDocument (From: "Gerriet M. Denkmann" <email@hidden>)

  • Prev by Date: Re: Binding InfoPanel to currentDocument
  • Next by Date: Saving with Encoding
  • Previous by thread: Re: Binding InfoPanel to currentDocument
  • Next by thread: Re: Binding InfoPanel to currentDocument
  • Index(es):
    • Date
    • Thread