views:

412

answers:

2

I have a NIB which contains two windows, one is the app's main window visible at launch and the other is a custom sheet (and therefore not visible at launch). When the sheet is required my controller calls:

[NSApp beginSheet: sheetWindow modalForWindow: mainWindow modalDelegate: self didEndSelector: @selector(didEndSheet:returnCode:contextInfo:) contextInfo: nil];

which displays the sheet window and starts a modal session, but the window has a standard Aqua title bar, is not 'connected' to the main window and can be moved around just like a regular window. Needless to say, this is not desirable :-). Why doesn't the sheet window "pop out" of the window it's run for, as sheets usually do when begun in this fashion?

I had wondered whether the fact that I was beginning the sheet inside the controller's -awakeFromNib might have an effect, so I moved the sheet to a button's action I could trigger later. This didn't change the behaviour. I haven't thought of anything else to try. I'm targeting the 10.5 SDK, using Xcode 3.1.

Edit: so it looks like I've created a modal dialog; sheets and app-modal dialogs are both started with the -beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo: method. But how do I indicate that my window should be a sheet and not a modal dialog?

+5  A: 

If mainWindow is nil then the sheet will be displayed as a window/dialog.

Nathan Kinsinger
+4  A: 

This happened to me a couple of days ago:

  • You forgot to set the window outlet of your window controller (File's owner of the Nib file). As Indicated by Nathan, you may see that the -[NSWindowController window] method returns nil.
  • You must also uncheck the Visible at launch option of the sheet.
Renaud Pradenc
"Visible at launch" turned out to be my problem - the sheet appeared at the correct time, but disconnected from its window, and would not disappear despite my orderOut: call. Thanks for posting this!
Adam Preble