web-dev-qa-db-ja.com

OS X-NSViewControllerはどのようにしてそのウィンドウを見つけることができますか?

ドキュメントベースのコアデータアプリがあります。メインのドキュメントウィンドウにはいくつかのビューがあり、それぞれ独自のカスタムNSViewControllerによって制御され、必要に応じて切り替えられます。これらの各ビューコントローラーがカスタムモーダルシートをドキュメントウィンドウからドロップダウンできるようにしたいのですが。ただし、ビューは独立していて、MyDocumentnibにないため、ビューをIBのドキュメントウィンドウにリンクできません。これは私が電話したとき

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

mainWindowにnilを指定しているので、シートが分離されているように見えます。

助言がありますか?

どうもありがとう

48
AJ.

[[self view] window]を使用できます

105
Tom Dalling

確かに、それはself.view.window(Swift)。

これは、viewDidLoad()およびviewWillAppear()でnilの場合がありますが、viewDidAppear()に到達するまでに適切に設定されます。

33
Tim Closs

コントローラが NSDocument サブクラスにアクセスできる場合、 -windowForSheet を使用できます。

1
JeremyP

tim Clossの回答の詳細:

-(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
}
0
user1105951

他の回答に関する1つの問題(つまり、self.view.window)は、ビューが非表示の場合、そのwindowプロパティがnilになるというケースを考慮していないことです。ビューはさまざまな理由で非表示になる場合があります(たとえば、タブビューで選択されていないビューの1つにある場合があります)。

次の(Swift)拡張機能は、ビューコントローラーの階層を昇順にすることでwindowControllerNSViewControllerを提供し、そこからwindowプロパティを調べることができます。

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
    }

}
0
marcprux