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

Как получить главное окно (делегат приложения) из другого класса (подкласс NSViewController)?

Я пытаюсь изменить свой контент 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];

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

4b9b3361

Ответ 1

Для метода mainWindow документы говорят:

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

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

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

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

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

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

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

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

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

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

Ответ 2

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

Цитата Apple:

MainWindow

Недвижимость

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

Обсуждение

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

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

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

Пообещайте, что это не будет nil, если приложение имеет окна.

Ответ 3

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

[myObject performSelector:@selector(theSelector) withObject:nil afterDelay:0.1];