Подтвердить что ты не робот

OS X - Как NSViewController может найти свое окно?

У меня есть приложение с базовыми данными на основе документов. В главном окне документа есть несколько видов, каждый из которых управляется собственным пользовательским NSViewController, который при необходимости переключается. Я хочу, чтобы каждый из этих контроллеров представлений мог вытащить пользовательский модальный лист из окна документа. Однако, поскольку представления являются отдельными, а не в MyDocument nib, я не могу связать представление с окном документа в IB. Это означает, что когда я вызываю

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

Im подает нуль для mainWindow, и поэтому лист выглядит отсоединенным.

Любые предложения?

Большое спасибо

4b9b3361

Ответ 1

Вы можете использовать [[self view] window]

Ответ 2

Действительно, это self.view.window (Swift).

Это может быть ноль в viewDidLoad() и viewWillAppear(), но он будет правильно установлен к тому времени, когда вы доберетесь до viewDidAppear().

Ответ 3

Если ваш контроллер может получить доступ к подклассу NSDocument, вы можете использовать - windowForSheet

Ответ 4

больше о Тиме Клоссе ответ:

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

Ответ 5

Одна проблема с другими ответами (то есть, просто смотря на self.view.window) заключается в том, что они не учитывают случай, когда, когда представление скрыто, его свойство window будет nil. Представление может быть скрыто по многим причинам (например, оно может быть в одном из невыбранных представлений в представлении с вкладками).

Следующее (быстрое) расширение предоставит windowController для NSViewController путем 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
    }

}