ドキュメントベースのコアデータアプリがあります。メインのドキュメントウィンドウにはいくつかのビューがあり、それぞれ独自のカスタムNSViewController
によって制御され、必要に応じて切り替えられます。これらの各ビューコントローラーがカスタムモーダルシートをドキュメントウィンドウからドロップダウンできるようにしたいのですが。ただし、ビューは独立していて、MyDocument
nib
にないため、ビューをIBのドキュメントウィンドウにリンクできません。これは私が電話したとき
[NSApp beginSheet: sheetWindow modalForWindow: mainWindow modalDelegate: self didEndSelector: @selector(didEndSheet:returnCode:contextInfo:) contextInfo: nil];
mainWindow
にnilを指定しているので、シートが分離されているように見えます。
助言がありますか?
どうもありがとう
[[self view] window]
を使用できます
確かに、それはself.view.window
(Swift)。
これは、viewDidLoad()およびviewWillAppear()でnilの場合がありますが、viewDidAppear()に到達するまでに適切に設定されます。
コントローラが NSDocument サブクラスにアクセスできる場合、 -windowForSheet を使用できます。
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
}
他の回答に関する1つの問題(つまり、self.view.window
)は、ビューが非表示の場合、そのwindow
プロパティがnil
になるというケースを考慮していないことです。ビューはさまざまな理由で非表示になる場合があります(たとえば、タブビューで選択されていないビューの1つにある場合があります)。
次の(Swift)拡張機能は、ビューコントローラーの階層を昇順にすることでwindowController
にNSViewController
を提供し、そこから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
}
}