Как получить главное окно (делегат приложения) из другого класса (подкласс 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];
(он дает предупреждение)
Ответы
Ответ 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];