OS X - Как NSViewController может найти свое окно? - PullRequest
43 голосов
/ 19 апреля 2011

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

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

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

Есть предложения?

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

Ответы [ 5 ]

104 голосов
/ 19 апреля 2011

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

32 голосов
/ 03 ноября 2016

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

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

1 голос
/ 19 апреля 2011

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

0 голосов
/ 01 апреля 2019

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

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

}
0 голосов
/ 11 декабря 2018

подробнее о ответе Тима Клосса:

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