AJ.
AJ.

Reputation: 1256

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

Upvotes: 54

Views: 31797

Answers (5)

marcprux
marcprux

Reputation: 10385

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
    }

}

Upvotes: 2

user1105951
user1105951

Reputation: 2287

more about Tim Closs answer :

-(void)viewDidAppear
{
    self.view.window.title = @"title-viewDidAppear"; //this only works when and after viewDidAppeer is called
}
-(void)viewWillDisappear
{
    self.view.window.title = @"title-viewWillDisappear"; //this only works before and when viewWillDisappear is called
}

Upvotes: 0

Tim Closs
Tim Closs

Reputation: 546

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().

Upvotes: 42

JeremyP
JeremyP

Reputation: 86671

If your controller can get access to the NSDocument subclass, you can use -windowForSheet

Upvotes: 1

Tom Dalling
Tom Dalling

Reputation: 24145

You can use [[self view] window]

Upvotes: 115

Related Questions