Как получить Main Window (App Delegate) из другого класса (подкласс NSViewController)? - PullRequest
20 голосов
/ 01 октября 2011

Я пытаюсь изменить свой контент Windows, из другого класса, который является подклассом NSViewController. Я пытаюсь код ниже, но ничего не делает.

[NSApplication sharedApplication]mainWindow]setContentView:[self view]]; //code in NSViewController

[NSApplication sharedApplication]mainWindow] // returns null

Я пытался добавить

[window makeMainWindow];

в классе App Delegate, но это не поможет.

Я что-то пропустил?

P.S. Также я использую код ниже для вызова любой функции-делегата в моем классе,

 [(appDelegate *) [[NSApplication sharedApplication]delegate]MyMethod];

но мне интересно, есть ли что-то лучшее без импорта класса делегата. Как то так

[[NSApplication sharedApplication]delegate]MyMethod];

(выдает предупреждение)

Ответы [ 3 ]

37 голосов
/ 02 октября 2011

Для метода mainWindow в документах написано :

Этот метод может вернуть nil, если nib-файл приложения не завершил загрузку, если получатель не активен или приложение скрыто.

Я только что создал быстрое тестовое приложение и поместил следующий код:

NSLog(@"%@", [[NSApplication sharedApplication] mainWindow]);

в мой метод applicationDidFinishLaunching:aNotification и метод действия, который я подключил к кнопке в главном окне моего приложения.

При запуске mainWindow был равен нулю, но когда я нажимал кнопку (после того, как все было запущено, работало и отображалось), mainWindow больше не было равно нулю.

NSApplication предоставляет другие методы, которые могут быть вам полезны:

  • - windows - массив всех окон;
  • – keyWindow - дает окно, которое получает ввод с клавиатуры (или ноль);
  • – windowWithWindowNumber: - возвращает окно, соответствующее номеру окна - если вы знаете номер окна, содержимое которого вы хотите заменить, вы можете использовать это;
  • – makeWindowsPerform:inOrder: - отправляет сообщение в каждое окно - вы можете использовать его для проверки каждого окна на предмет его заинтересованности.

Что касается вызова методов на delegate, то, что вы говорите, выдает предупреждение, прекрасно работает для меня. Например, это работает без предупреждений:

NSLog(@"%@", [[[NSApplication sharedApplication]delegate] description]);

Какое именно предупреждение вы получаете? Вы пытаетесь вызвать метод, который не существует?

19 голосов
/ 10 апреля 2015

Борьба с MacOS только что поняла это.

Цитата Apple:

mainWindow

Свойство

Главное окно приложения.(только для чтения)

Обсуждение

Значение в этом свойстве равно nil, когда раскадровка приложения или файл пера еще не завершена загрузка.Также это может быть ноль, если приложение неактивно или скрыто .

Если у вас есть только одно окно в приложении (что является наиболее часто используемым случаем)) используйте следующий код:

NSWindow *mainWindow = [[[NSApplication sharedApplication] windows] objectAtIndex:0];

Обещайте, что оно не будет равно нулю, если в приложении есть окна.

0 голосов
/ 24 декабря 2016

Если свойство окна еще не установлено, попробуйте отложить что-то до завершения загрузки приложения, например:

[myObject performSelector:@selector(theSelector) withObject:nil afterDelay:0.1];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...