Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OS X - How can a NSViewController find its window?

I have a Document based core data app. The main document window has a number of views, each controlled by its own custom NSViewController which are switched in as necessary. I want each of these view controllers to be able to drop down a custom modal sheet from the document window. However because the views are separate and not in the MyDocument nib I cannot link the view to the document window in IB. This means that when I call

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

I’m supplying nil for mainWindow and the sheet therefore appears detached.

Any suggestions?

Many Thanks

like image 702
AJ. Avatar asked Apr 19 '11 03:04

AJ.


3 Answers

You can use [[self view] window]

like image 54
Tom Dalling Avatar answered Nov 19 '22 17:11

Tom Dalling


Indeed, it's self.view.window (Swift).

This may be nil in viewDidLoad() and viewWillAppear(), but is set properly by the time you get to viewDidAppear().

like image 42
Tim Closs Avatar answered Nov 19 '22 18:11

Tim Closs


One issue with the other answers (i.e., just looking at self.view.window) is that they don't take into account the case that when a view is hidden, its window property will be nil. A view might be hidden for a lot of reasons (for example, it might be in one of the unselected views in a tab view).

The following (swift) extension will provide the windowController for a NSViewController by ascending the view controller hierarchy, from which the window property may then be examined:

public extension NSViewController {
    /// Returns the window controller associated with this view controller
    var windowController: NSWindowController? {
        return ((self.isViewLoaded == false ? nil : self.view)?.window?.windowController)
            ?? self.parent?.windowController // fallback to the parent; hidden views like those in NSTabView don't have a window
    }

}
like image 2
marcprux Avatar answered Nov 19 '22 18:11

marcprux